| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- "use client";
- import Link from "next/link";
- import { usePathname } from "next/navigation";
- import { useState } from "react";
- import { BrandLogo } from "@/components/brand/brand-logo";
- import { MenuIcon } from "@/components/icons/menu";
- import { buttonVariants } from "@/components/ui/button";
- import { MARKETING_PRIMARY_NAV } from "@/lib/marketing-nav";
- import { cn } from "@/lib/utils";
- export function SiteHeader() {
- const pathname = usePathname();
- const [open, setOpen] = useState(false);
- return (
- <header className="sticky top-0 z-40 bg-background/80 backdrop-blur-md">
- <div className="mx-auto flex h-16 max-w-6xl items-center justify-between gap-4 px-5 lg:px-8">
- <Link
- href="/"
- className="flex items-center gap-2.5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-accent"
- onClick={() => setOpen(false)}
- >
- <BrandLogo height={32} priority />
- <span className="font-display text-lg font-semibold tracking-tight">
- krypco
- </span>
- </Link>
- <nav
- className="hidden items-center gap-1 lg:flex"
- aria-label="Primary"
- >
- {MARKETING_PRIMARY_NAV.map((item) => {
- const active =
- pathname === item.href || pathname.startsWith(`${item.href}/`);
- return (
- <Link
- key={item.href}
- href={item.href}
- aria-current={active ? "page" : undefined}
- className={cn(
- "rounded-md px-3 py-2 text-[13px] transition-colors",
- active
- ? "text-foreground"
- : "text-muted-foreground hover:text-foreground",
- )}
- >
- {item.label}
- </Link>
- );
- })}
- </nav>
- <div className="flex items-center gap-2">
- <Link
- href="/portal"
- className={cn(
- buttonVariants({ variant: "outline", size: "sm" }),
- "hidden sm:inline-flex",
- )}
- >
- Open portal
- </Link>
- <button
- type="button"
- className="inline-flex h-10 w-10 items-center justify-center rounded-md border border-border text-muted-foreground hover:bg-muted hover:text-foreground lg:hidden"
- aria-label={open ? "Close menu" : "Open menu"}
- aria-expanded={open}
- onClick={() => setOpen((v) => !v)}
- >
- <MenuIcon size={18} />
- </button>
- </div>
- </div>
- {open ? (
- <div className="bg-card lg:hidden">
- <nav className="mx-auto flex max-w-6xl flex-col gap-1 px-5 py-4" aria-label="Mobile">
- {MARKETING_PRIMARY_NAV.map((item) => (
- <Link
- key={item.href}
- href={item.href}
- onClick={() => setOpen(false)}
- className="rounded-md px-3 py-3 text-[13px] text-muted-foreground hover:bg-muted hover:text-foreground"
- >
- {item.label}
- </Link>
- ))}
- <Link
- href="/about"
- onClick={() => setOpen(false)}
- className="rounded-md px-3 py-3 text-sm text-muted-foreground hover:bg-muted hover:text-foreground"
- >
- About
- </Link>
- <Link
- href="/contact"
- onClick={() => setOpen(false)}
- className="rounded-md px-3 py-3 text-sm text-muted-foreground hover:bg-muted hover:text-foreground"
- >
- Contact
- </Link>
- <Link
- href="/portal"
- onClick={() => setOpen(false)}
- className={cn(buttonVariants({ variant: "primary" }), "mt-2")}
- >
- Open portal
- </Link>
- </nav>
- </div>
- ) : null}
- </header>
- );
- }
|