Topbar Menu

Dropdown menu for topbar actions

SaaSNavigation

Overview

TopbarMenu wraps Radix UI DropdownMenu to provide a consistent dropdown menu for topbar actions. It accepts a trigger element and an array of navigation items with optional icons, badges, and disabled states. TopbarMenuItem renders individual items within the dropdown.

Usage

import { TopbarMenu } from "@leanicon/web-builder-library/saas";

<TopbarMenu
  trigger={<button>Menu</button>}
  items={[
    { id: "profile", label: "Profile" },
    { id: "settings", label: "Settings" },
    { id: "logout", label: "Log out" },
  ]}
  onItemClick={(item) => handleAction(item.id)}
/>;

Variants

Default

<div className="flex h-14 items-center justify-end bg-background border-b border-border px-4">
  <SaaSNavigationTopbarMenu
    trigger={
      <button
        type="button"
        className="flex h-8 w-8 items-center justify-center rounded-full bg-muted text-muted-foreground hover:bg-accent transition-colors"
      >
        <span className="text-xs">U</span>
      </button>
    }
    items={[
      { id: "profile", label: "Profile" },
      { id: "settings", label: "Settings" },
      { id: "logout", label: "Log out" },
    ]}
  />
</div>

With Label Trigger

<div className="flex h-14 items-center justify-end bg-background border-b border-border px-4">
  <SaaSNavigationTopbarMenu
    trigger={
      <button
        type="button"
        className="flex items-center gap-2 rounded-md px-3 py-1.5 text-sm font-medium text-foreground hover:bg-accent transition-colors"
      >
        <div className="h-6 w-6 rounded-full bg-primary" />
        <span>Jane Doe</span>
      </button>
    }
    items={[
      { id: "profile", label: "Profile" },
      { id: "billing", label: "Billing" },
      { id: "settings", label: "Settings" },
      { id: "logout", label: "Log out" },
    ]}
  />
</div>

With Disabled Item

<div className="flex h-14 items-center justify-end bg-background border-b border-border px-4">
  <SaaSNavigationTopbarMenu
    trigger={
      <button
        type="button"
        className="flex items-center gap-1.5 rounded-md px-2.5 py-1.5 text-sm text-muted-foreground hover:bg-accent transition-colors"
      >
        <span>Help</span>
      </button>
    }
    items={[
      { id: "docs", label: "Documentation" },
      { id: "security", label: "Security" },
      { id: "support", label: "Contact support", disabled: true },
    ]}
    align="end"
  />
</div>

Notification Menu

<div className="flex h-14 items-center justify-end bg-background border-b border-border px-4">
  <SaaSNavigationTopbarMenu
    trigger={
      <button
        type="button"
        className="relative flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground hover:bg-accent transition-colors"
      >
        <span className="text-xs">B</span>
        <span className="absolute -right-0.5 -top-0.5 flex h-3.5 w-3.5 items-center justify-center rounded-full bg-destructive text-[9px] font-medium text-destructive-foreground">
          3
        </span>
      </button>
    }
    items={[
      { id: "mark-read", label: "Mark all as read" },
      { id: "preferences", label: "Notification preferences" },
    ]}
    align="end"
  />
</div>

Dark

<div className="flex h-14 items-center justify-end border-b border-border px-4">
  <SaaSNavigationTopbarMenu
    trigger={
      <button
        type="button"
        className="flex h-8 w-8 items-center justify-center rounded-full bg-muted text-muted-foreground hover:bg-accent transition-colors"
      >
        <span className="text-xs">U</span>
      </button>
    }
    items={[
      { id: "profile", label: "Profile" },
      { id: "settings", label: "Settings" },
      { id: "logout", label: "Log out" },
    ]}
  />
</div>

TopbarMenuItem - Default

<div className="w-48 rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md">
  <SaaSNavigationTopbarMenuItem item={{ id: "profile", label: "Profile" }} />
  <SaaSNavigationTopbarMenuItem item={{ id: "settings", label: "Settings" }} />
  <SaaSNavigationTopbarMenuItem item={{ id: "logout", label: "Log out" }} />
</div>

TopbarMenuItem - Disabled

<div className="w-48 rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md">
  <SaaSNavigationTopbarMenuItem
    item={{ id: "support", label: "Contact support", disabled: true }}
  />
</div>

TopbarMenuItem - Dark

<div className="w-48 rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md">
  <SaaSNavigationTopbarMenuItem item={{ id: "profile", label: "Profile" }} />
  <SaaSNavigationTopbarMenuItem item={{ id: "settings", label: "Settings" }} />
  <SaaSNavigationTopbarMenuItem item={{ id: "logout", label: "Log out" }} />
</div>

Props

NameTypeDefaultRequiredDescription
itemsNavigationItem[]—YesMenu items
triggerReactNode—YesTrigger element
alignenumendNoMenu alignment
onItemClick((item: NavigationItem) => void)—NoCallback when an item is clicked