| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- "use client";
- import Link from "next/link";
- import { usePathname } from "next/navigation";
- import { BrandIcon } from "@/components/brand/brand-icon";
- import { NAV_GROUPS } from "@/lib/nav";
- import { cn } from "@/lib/utils";
- interface SidebarProps {
- open: boolean;
- onClose: () => void;
- }
- export function Sidebar({ open, onClose }: SidebarProps) {
- const pathname = usePathname();
- return (
- <>
- <div
- aria-hidden
- onClick={onClose}
- className={cn(
- "fixed inset-0 z-30 bg-background/70 backdrop-blur-sm transition-opacity lg:hidden",
- open ? "opacity-100" : "pointer-events-none opacity-0",
- )}
- />
- <aside
- className={cn(
- "fixed inset-y-0 left-0 z-40 flex w-64 flex-col border-r border-border bg-card transition-transform lg:translate-x-0",
- open ? "translate-x-0" : "-translate-x-full",
- )}
- >
- <div className="flex h-14 items-center justify-between gap-2 border-b border-border px-4">
- <Link
- href="/portal"
- onClick={onClose}
- className="flex items-center gap-2.5"
- >
- <BrandIcon size={26} />
- <span className="font-display text-lg font-semibold tracking-tight">
- krypco
- </span>
- </Link>
- <Link
- href="/"
- onClick={onClose}
- className="text-[11px] text-muted-foreground hover:text-foreground"
- >
- Site
- </Link>
- </div>
- <nav className="flex-1 overflow-y-auto px-3 py-4">
- {NAV_GROUPS.map((group) => (
- <div key={group.label} className="mb-5">
- <p className="mb-1.5 px-3 text-xs font-medium uppercase tracking-wider text-muted-foreground">
- {group.label}
- </p>
- <ul className="flex flex-col gap-0.5">
- {group.items.map((item) => {
- const active =
- item.href === "/portal"
- ? pathname === "/portal"
- : pathname === item.href ||
- pathname.startsWith(`${item.href}/`);
- const Icon = item.icon;
- return (
- <li key={item.href}>
- <Link
- href={item.href}
- onClick={onClose}
- aria-current={active ? "page" : undefined}
- className={cn(
- "flex min-h-11 items-center gap-3 rounded-md px-3 py-2.5 text-sm transition-colors sm:min-h-0 sm:py-2",
- active
- ? "bg-accent-muted font-medium text-accent-hover"
- : "text-muted-foreground hover:bg-muted hover:text-foreground",
- )}
- >
- <Icon size={17} />
- {item.label}
- </Link>
- </li>
- );
- })}
- </ul>
- </div>
- ))}
- </nav>
- <div className="border-t border-border px-5 py-4">
- <p className="text-xs text-muted-foreground">
- portal · follow the hybrid path
- </p>
- </div>
- </aside>
- </>
- );
- }
|