Store Categories Mega

About this block

Store Categories MegaPRO

A store bar with a wordmark, category triggers (Women, Men, Kids, Home) that each drop a full-width panel of four link columns beside a New in photo tile, and on the right an inline search input, an account icon and a bag icon with a count bubble. On phones a left drawer opens with the categories as tabs across its top. Every panel and tab content stays in the markup and is toggled with CSS.

A store bar with category triggers that each drop a full-width panel of four link columns beside a New in photo tile, an inline search input, an account icon and a bag icon with a count bubble, with a tabbed left drawer on phones.

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.

Upgrade Now

Installation

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

bash
npx shadcn add "https://beste.dev/r/navbar91?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

bash
npx shadcn add "https://beste.dev/r-base/navbar91?email=YOUR_EMAIL&license_key=YOUR_KEY"

This installs the block to components/beste/block/navbar91.tsx plus the shadcn input primitive it uses.

Quick start

The installed file exports navbar91Demo alongside the block: the exact props behind the preview above. Spread it to get a working navbar in one line.

tsx
import { Navbar91, navbar91Demo } from "@/components/beste/block/navbar91";

export default function Page() {
  return <Navbar91 {...navbar91Demo} />;
}

Then replace the demo with your own props. Written out, a trimmed setup looks like this:

tsx
import { Navbar91 } from "@/components/beste/block/navbar91";

export default function Page() {
  return (
    <Navbar91
      brand="Harbor"
      categories={[
        {
          label: "Women",
          href: "/women",
          columns: [
            {
              title: "Clothing",
              links: [
                { label: "Dresses", href: "/women/dresses" },
                { label: "Knitwear", href: "/women/knitwear" },
              ],
            },
            { title: "Shoes", links: [{ label: "Boots", href: "/women/boots" }] },
          ],
          featured: {
            eyebrow: "New in",
            title: "The wool coat, back in four colours",
            href: "/women/coats",
            image: { src: "/photos/coat.jpg", alt: "A wool coat on a rail" },
          },
        },
        {
          label: "Men",
          href: "/men",
          columns: [{ title: "Clothing", links: [{ label: "Shirts", href: "/men/shirts" }] }],
          featured: {
            eyebrow: "New in",
            title: "Field watches with a sapphire face",
            href: "/men/watches",
            image: { src: "/photos/watch.jpg", alt: "A field watch" },
          },
        },
      ]}
      bagCount={3}
      labels={{ search: "Search the store", account: "Account", bag: "Bag", open: "Open menu", close: "Close menu" }}
    />
  );
}

Props

PropTypeDefaultDescription
brandstring–Wordmark on the left
categoriesCategory[][]Category triggers; one mega panel and one drawer tab each
bagCountnumber–Count shown in the bubble on the bag icon; hidden when 0 or unset
labels{ search?: string; account?: string; bag?: string; open?: string; close?: string }{}Placeholder for the search input and accessible names for the icon buttons and the menu toggle
classNamestring–Extra classes for the outer <header>
ts
type Category = {
  label: string;
  href: string;
  columns: LinkGroup[];
  featured: Featured;
};

type LinkGroup = {
  title: string;
  links: NavItem[];
};

type Featured = {
  eyebrow: string;
  title: string;
  href: string;
  image: { src: string; alt: string };
};

type NavItem = {
  label: string;
  href: string;
};

Behavior notes

  • One panel is rendered per category and all of them are server-rendered; the open one is revealed by swapping invisible -translate-y-1 opacity-0 for visible translate-y-0 opacity-100, so every column link is in the HTML.
  • Open state is the category index, so moving the pointer along the bar swaps panels without a close step; the panels close on Escape, on a click outside the header and when the pointer leaves it.
  • Category triggers carry aria-expanded and aria-controls pointing at their panel through a useId prefix.
  • The mobile drawer uses the categories as role="tab" buttons across its top; all four tab panels are mounted and the inactive ones are hidden with CSS, with aria-selected and aria-hidden kept in sync.
  • The drawer is inert while closed so its off-screen links are not keyboard-reachable, and a scrim closes it on tap; links inside it close it on click.
  • The bag bubble only renders when bagCount is a number above zero.

More Navigation blocks

View all Navigation
PRO

navbar92

Searchable Resources Mega

PRO

navbar85

Split Links Tile Mega

PRO

navbar95

Preview Card Mega

Get Pro