An edge-to-edge bar built as a row of cells split by hairline borders: brand, link cells, an empty spacer and a button cell, with no gaps between them. The Services cell drops a full-width row of four bordered cards with a title, a line and an arrow, and the phone menu slides down as a two-column grid of cells. Every panel stays in the markup and is toggled with CSS.
An edge-to-edge sticky bar built as a row of cells split by hairline borders: the brand, one cell per link, an empty spacer and a button cell, with no gaps. The Services cell drops a full-width row of four bordered cards, each with a title, a line and an arrow; on a phone the menu slides down as a two-column grid of the same kind of cells.
Upgrade to Pro
Pro blocks install through the shadcn CLI with your license key and ship their full source. Docs and live previews stay open to everyone, so you can read every block's details first.
Swap YOUR_EMAIL and YOUR_KEY for the email and license key on your account. Find your license key on your account page.
Radix flavor
npx shadcn add "https://beste.dev/r/navbar100?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://beste.dev/r-base/navbar100?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/navbar100.tsx plus the shadcn button primitive it uses.
The installed file exports navbar100Demo alongside the block: the exact props behind the preview above. Spread it to get a working navbar in one line.
import { Navbar100, navbar100Demo } from "@/components/beste/block/navbar100";
export default function Page() {
return <Navbar100 {...navbar100Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Navbar100 } from "@/components/beste/block/navbar100";
export default function Page() {
return (
<Navbar100
brand="Alder Studio"
mega={{
label: "Services",
cards: [
{ title: "Brand identity", description: "Names, marks and rules.", href: "/identity" },
{ title: "Websites", description: "Fast sites your team can edit.", href: "/websites" },
{ title: "Product design", description: "Interfaces tested and shipped.", href: "/product" },
],
}}
links={[
{ label: "Work", href: "/work" },
{ label: "Studio", href: "/studio" },
]}
action={{ label: "Start a project", href: "/contact" }}
labels={{ open: "Open menu", close: "Close menu" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
brand | string | – | Wordmark in the first cell |
mega | Mega | – | The cell that opens the services row |
links | NavItem[] | [] | One cell per link |
action | ActionButton | – | Button in the last cell, repeated at the foot of the mobile menu |
labels | { open?: string; close?: string } | {} | Accessible names for the mobile toggle |
className | string | – | Extra classes for the outer <header> |
type Mega = {
label: string;
cards: ServiceCard[];
};
type ServiceCard = {
title: string;
description: string;
href: string;
};
type NavItem = {
label: string;
href: string;
};
type ActionButton = {
label: string;
href: string;
variant?: "default" | "outline" | "ghost" | "secondary";
};aria-hidden and inert.border-l border-border; an empty flex-1 cell pushes the button cell to the right edge, so the borders line up from edge to edge.aria-expanded and aria-controls, and its plus icon turns into a cross while open; the row closes when the pointer leaves the header, on Escape and on a pointer down outside.grid-template-rows transition and shows the cards and links as a two-column grid of bordered cells; links close the menu on click.