Placeholder section under the navbar.
A two row header for service businesses. A thin top bar lists address, email and phone in ruled cells, with social icons in square cells on the right. Below it, a logo card hangs over the next section beside the company name, and the links sit on the right with an active state and a standard dropdown that opens on hover, click or keyboard focus. On small screens the top bar keeps only the linked contacts, the logo card still hangs over the next section, the company name sits centered, and a bordered menu button opens the links with collapsible submenus.
A two row header for service businesses: a thin top bar with address, email, phone and social icons in ruled cells, and a menu row where a logo card hangs over the section below while the links, an active state and a standard dropdown sit on the right. On a phone the top bar keeps only the linked contacts, the company name sits centered, and a bordered button opens the menu with collapsible submenus.
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.
Remove the preview section
The installed file renders a sample section with a background photo right after the header, marked with a TEMP comment. It is there so the preview shows how the logo hangs over the next section. Delete that section (and the fragment around the return) before you use the block, or every page with this navbar gets the sample photo and heading under it.
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/navbar118?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://beste.dev/r-base/navbar118?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/navbar118.tsx. It uses no shadcn primitives, only lucide-react icons and next/image.
The installed file exports navbar118Demo alongside the block: the exact props behind the preview above. Spread it to get a working navbar in one line.
import { Navbar118, navbar118Demo } from "@/components/beste/block/navbar118";
export default function Page() {
return <Navbar118 {...navbar118Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Facebook, Instagram, Mail, MapPin, Phone } from "lucide-react";
import { Navbar118 } from "@/components/beste/block/navbar118";
export default function Page() {
return (
<Navbar118
logo={{ src: "/logo.png", alt: "Harbor Insurance Brokers" }}
brand="Harbor Insurance Brokers"
contacts={[
{ label: "Brooklyn, New York", icon: MapPin },
{ label: "[email protected]", href: "mailto:[email protected]", icon: Mail },
{ label: "(+1) 718 555 0179", href: "tel:+17185550179", icon: Phone },
]}
socials={[
{ label: "Instagram", href: "https://instagram.com", icon: Instagram },
{ label: "Facebook", href: "https://facebook.com", icon: Facebook },
]}
items={[
{ label: "Home", href: "/", isActive: true },
{ label: "About us", href: "/about" },
{
label: "Our products",
href: "/products",
children: [
{ label: "Car insurance", href: "/products/car" },
{ label: "Health insurance", href: "/products/health" },
],
},
{ label: "Contact", href: "/contact" },
]}
labels={{ open: "Open menu", close: "Close menu" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
logo | { src: string; alt: string } | – | Image shown in the hanging logo card |
hideLogoBorder | boolean | false | Removes the border around the logo card |
hideLogoShadow | boolean | false | Removes the shadow under the logo card |
brand | string | – | Company name next to the logo |
contacts | ContactItem[] | [] | Cells in the top bar; the ones with href also show on phones |
socials | SocialLink[] | [] | Square icon cells on the right of the top bar, hidden on phones |
items | NavItem[] | [] | Menu links; an item with children becomes a dropdown |
labels | { open?: string; close?: string } | {} | Accessible names for the mobile menu button |
className | string | – | Extra classes for the outer header |
type ContactItem = {
label: string;
href?: string;
icon?: LucideIcon;
};
type SocialLink = {
label: string;
href: string;
icon: LucideIcon;
};
type NavItem = {
label: string;
href: string;
isActive?: boolean;
children?: NavChild[];
};
type NavChild = {
label: string;
href: string;
};h-14, md:h-16) with a full width line under it, and the logo card is absolutely positioned inside a slot of that height. The header always ends at the line, so the next section starts there with no setting on the layout or on that section, and the card hangs over it.relative z-30, so the card stays above a following section unless that section sets a higher z-index of its own. Its shadow only falls downward, so no shadow shows above the card.inert.lg up the card always stays visible.href render as plain a elements, which is right for mailto: and tel: targets. Contacts without one, like an address, are hidden on phones and listed again at the foot of the mobile menu.isActive; nothing is derived from the current URL, so set it from your router.