dropdown

Displays a menu to the user — such as a set of actions or functions — triggered by a button.

PreviousNext
import { ChangeDetectionStrategy, Component } from '@angular/core';

import { ZardButtonComponent } from '@/shared/components/button';
import { ZardDropdownImports } from '@/shared/components/dropdown/dropdown.imports';

@Component({
  selector: 'z-demo-dropdown-preview',
  imports: [ZardDropdownImports, ZardButtonComponent],
  template: `
    <button type="button" z-button zType="outline" z-dropdown [zDropdownMenu]="menu">Open</button>

    <z-dropdown-menu-content #menu="zDropdownMenuContent" class="w-56">
      <z-dropdown-menu-label>My Account</z-dropdown-menu-label>
      <z-dropdown-menu-item (click)="log('Profile')">
        Profile
        <z-dropdown-menu-shortcut>⇧⌘P</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Billing')">
        Billing
        <z-dropdown-menu-shortcut>⌘B</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Settings')">
        Settings
        <z-dropdown-menu-shortcut>⌘S</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Keyboard shortcuts')">
        Keyboard shortcuts
        <z-dropdown-menu-shortcut>⌘K</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>
      <z-dropdown-menu-separator />
      <z-dropdown-menu-item (click)="log('Team')">Team</z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('New Team')">
        New Team
        <z-dropdown-menu-shortcut>⌘+T</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>
      <z-dropdown-menu-separator />
      <z-dropdown-menu-item (click)="log('GitHub')">GitHub</z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Support')">Support</z-dropdown-menu-item>
      <z-dropdown-menu-item [disabled]="true">API</z-dropdown-menu-item>
      <z-dropdown-menu-separator />
      <z-dropdown-menu-item (click)="log('Log out')">
        Log out
        <z-dropdown-menu-shortcut>⇧⌘Q</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>
    </z-dropdown-menu-content>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ZardDemoDropdownPreviewComponent {
  log(item: string) {
    console.log(`${item} clicked`);
  }
}

Installation

Copy
npx zard-cli@latest add dropdown

Usage

import { ZardDropdownImports } from '@/shared/components/dropdown/dropdown.imports';
Copy
<button z-button zType="outline" z-dropdown [zDropdownMenu]="menu">Open</button>

<z-dropdown-menu-content #menu="zDropdownMenuContent" class="w-48">
  <z-dropdown-menu-item>Profile</z-dropdown-menu-item>
  <z-dropdown-menu-item>Settings</z-dropdown-menu-item>
  <z-dropdown-menu-item zDisabled>Subscription</z-dropdown-menu-item>
</z-dropdown-menu-content>
Copy

Examples

basic

A basic dropdown menu with a label and a separator.
import { ChangeDetectionStrategy, Component } from '@angular/core';

import { ZardButtonComponent } from '@/shared/components/button';
import { ZardDropdownImports } from '@/shared/components/dropdown/dropdown.imports';

@Component({
  selector: 'z-demo-dropdown-basic',
  imports: [ZardDropdownImports, ZardButtonComponent],
  template: `
    <button type="button" z-button zType="outline" z-dropdown [zDropdownMenu]="menu">Open menu</button>

    <z-dropdown-menu-content #menu="zDropdownMenuContent" class="w-48">
      <z-dropdown-menu-label>My Account</z-dropdown-menu-label>
      <z-dropdown-menu-item (click)="log('Profile')">Profile</z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Billing')">Billing</z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Team')">Team</z-dropdown-menu-item>
      <z-dropdown-menu-separator />
      <z-dropdown-menu-item [disabled]="true">Subscription</z-dropdown-menu-item>
    </z-dropdown-menu-content>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ZardDemoDropdownBasicComponent {
  log(item: string) {
    console.log(`${item} clicked`);
  }
}

submenu

Use z-dropdown-menu-sub-trigger with a z-dropdown-menu-sub-content to nest secondary actions.
import { ChangeDetectionStrategy, Component } from '@angular/core';

import { ZardButtonComponent } from '@/shared/components/button';
import { ZardDropdownImports } from '@/shared/components/dropdown/dropdown.imports';

@Component({
  selector: 'z-demo-dropdown-submenu',
  imports: [ZardDropdownImports, ZardButtonComponent],
  template: `
    <button type="button" z-button zType="outline" z-dropdown [zDropdownMenu]="menu">Open</button>

    <z-dropdown-menu-content #menu="zDropdownMenuContent" class="w-56">
      <z-dropdown-menu-item (click)="log('Back')">Back</z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Forward')">Forward</z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Reload')">Reload</z-dropdown-menu-item>
      <z-dropdown-menu-separator />
      <z-dropdown-menu-sub-trigger [zSubMenu]="moreTools">More Tools</z-dropdown-menu-sub-trigger>
      <z-dropdown-menu-sub-content #moreTools="zDropdownMenuSubContent" class="w-48">
        <z-dropdown-menu-item (click)="log('Save Page As')">Save Page As...</z-dropdown-menu-item>
        <z-dropdown-menu-item (click)="log('Create Shortcut')">Create Shortcut...</z-dropdown-menu-item>
        <z-dropdown-menu-item (click)="log('Developer Tools')">Developer Tools</z-dropdown-menu-item>
      </z-dropdown-menu-sub-content>
    </z-dropdown-menu-content>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ZardDemoDropdownSubmenuComponent {
  log(item: string) {
    console.log(`${item} clicked`);
  }
}

shortcuts

Add z-dropdown-menu-shortcut to show keyboard hints.
import { ChangeDetectionStrategy, Component } from '@angular/core';

import { ZardButtonComponent } from '@/shared/components/button';
import { ZardDropdownImports } from '@/shared/components/dropdown/dropdown.imports';

@Component({
  selector: 'z-demo-dropdown-shortcuts',
  imports: [ZardDropdownImports, ZardButtonComponent],
  template: `
    <button type="button" z-button zType="outline" z-dropdown [zDropdownMenu]="menu">Account</button>

    <z-dropdown-menu-content #menu="zDropdownMenuContent" class="w-56">
      <z-dropdown-menu-label>My Account</z-dropdown-menu-label>
      <z-dropdown-menu-item (click)="log('Profile')">
        Profile
        <z-dropdown-menu-shortcut>⇧⌘P</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Billing')">
        Billing
        <z-dropdown-menu-shortcut>⌘B</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Settings')">
        Settings
        <z-dropdown-menu-shortcut>⌘S</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>
      <z-dropdown-menu-separator />
      <z-dropdown-menu-item (click)="log('Log out')">
        Log out
        <z-dropdown-menu-shortcut>⇧⌘Q</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>
    </z-dropdown-menu-content>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ZardDemoDropdownShortcutsComponent {
  log(item: string) {
    console.log(`${item} clicked`);
  }
}

icons

Combine icons with labels for quick scanning.
import { ChangeDetectionStrategy, Component } from '@angular/core';

import { NgIcon, provideIcons } from '@ng-icons/core';
import { lucideCreditCard, lucideKeyboard, lucideSettings, lucideUser } from '@ng-icons/lucide';

import { ZardButtonComponent } from '@/shared/components/button';
import { ZardDropdownImports } from '@/shared/components/dropdown/dropdown.imports';

@Component({
  selector: 'z-demo-dropdown-icons',
  imports: [ZardDropdownImports, ZardButtonComponent, NgIcon],
  template: `
    <button type="button" z-button zType="outline" z-dropdown [zDropdownMenu]="menu">Open</button>

    <z-dropdown-menu-content #menu="zDropdownMenuContent" class="w-56">
      <z-dropdown-menu-item (click)="log('Profile')">
        <ng-icon name="lucideUser" class="mr-2 size-4" />
        Profile
      </z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Billing')">
        <ng-icon name="lucideCreditCard" class="mr-2 size-4" />
        Billing
      </z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Settings')">
        <ng-icon name="lucideSettings" class="mr-2 size-4" />
        Settings
      </z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Keyboard shortcuts')">
        <ng-icon name="lucideKeyboard" class="mr-2 size-4" />
        Keyboard shortcuts
      </z-dropdown-menu-item>
    </z-dropdown-menu-content>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
  viewProviders: [provideIcons({ lucideUser, lucideCreditCard, lucideSettings, lucideKeyboard })],
})
export class ZardDemoDropdownIconsComponent {
  log(item: string) {
    console.log(`${item} clicked`);
  }
}

checkboxes

Use z-dropdown-menu-checkbox-item for toggles.
import { Component, ChangeDetectionStrategy } from '@angular/core';

import { ZardButtonComponent } from '@/shared/components/button';
import { ZardDropdownImports } from '@/shared/components/dropdown/dropdown.imports';

@Component({
  selector: 'z-demo-dropdown-checkboxes',
  imports: [ZardDropdownImports, ZardButtonComponent],
  template: `
    <button type="button" z-button zType="outline" z-dropdown [zDropdownMenu]="menu">View options</button>

    <z-dropdown-menu-content #menu="zDropdownMenuContent" class="w-56">
      <z-dropdown-menu-checkbox-item [(zChecked)]="statusBar">Status Bar</z-dropdown-menu-checkbox-item>
      <z-dropdown-menu-checkbox-item [(zChecked)]="activityBar">Activity Bar</z-dropdown-menu-checkbox-item>
      <z-dropdown-menu-checkbox-item [(zChecked)]="panel">Panel</z-dropdown-menu-checkbox-item>
    </z-dropdown-menu-content>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ZardDemoDropdownCheckboxesComponent {
  statusBar = true;
  activityBar = false;
  panel = false;
}

checkboxes icons

Add icons to checkbox items.
import { ChangeDetectionStrategy, Component } from '@angular/core';

import { NgIcon, provideIcons } from '@ng-icons/core';
import { lucideBell, lucideMail, lucideMessageSquare } from '@ng-icons/lucide';

import { ZardButtonComponent } from '@/shared/components/button';
import { ZardDropdownImports } from '@/shared/components/dropdown/dropdown.imports';

@Component({
  selector: 'z-demo-dropdown-checkboxes-icons',
  imports: [ZardDropdownImports, ZardButtonComponent, NgIcon],
  template: `
    <button type="button" z-button zType="outline" z-dropdown [zDropdownMenu]="menu">Notifications</button>

    <z-dropdown-menu-content #menu="zDropdownMenuContent" class="w-64">
      <z-dropdown-menu-label>Notification Preferences</z-dropdown-menu-label>
      <z-dropdown-menu-checkbox-item [(zChecked)]="email">
        <ng-icon name="lucideMail" class="mr-2 size-4" />
        Email notifications
      </z-dropdown-menu-checkbox-item>
      <z-dropdown-menu-checkbox-item [(zChecked)]="sms">
        <ng-icon name="lucideMessageSquare" class="mr-2 size-4" />
        SMS notifications
      </z-dropdown-menu-checkbox-item>
      <z-dropdown-menu-checkbox-item [(zChecked)]="push">
        <ng-icon name="lucideBell" class="mr-2 size-4" />
        Push notifications
      </z-dropdown-menu-checkbox-item>
    </z-dropdown-menu-content>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
  viewProviders: [provideIcons({ lucideMail, lucideMessageSquare, lucideBell })],
})
export class ZardDemoDropdownCheckboxesIconsComponent {
  email = true;
  sms = false;
  push = true;
}

radio group

Use z-dropdown-menu-radio-group for exclusive choices.
import { Component, ChangeDetectionStrategy } from '@angular/core';

import { ZardButtonComponent } from '@/shared/components/button';
import { ZardDropdownImports } from '@/shared/components/dropdown/dropdown.imports';

@Component({
  selector: 'z-demo-dropdown-radio-group',
  imports: [ZardDropdownImports, ZardButtonComponent],
  template: `
    <button type="button" z-button zType="outline" z-dropdown [zDropdownMenu]="menu">Panel position</button>

    <z-dropdown-menu-content #menu="zDropdownMenuContent" class="w-56">
      <z-dropdown-menu-label>Panel Position</z-dropdown-menu-label>
      <z-dropdown-menu-radio-group [(zValue)]="selected">
        @for (position of positions; track position.value) {
          <z-dropdown-menu-radio-item [zValue]="position.value">
            {{ position.label }}
          </z-dropdown-menu-radio-item>
        }
      </z-dropdown-menu-radio-group>
    </z-dropdown-menu-content>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ZardDemoDropdownRadioGroupComponent {
  selected = 'bottom';
  positions = [
    { value: 'top', label: 'Top' },
    { value: 'bottom', label: 'Bottom' },
    { value: 'right', label: 'Right' },
  ];
}

radio icons

Show radio options with icons.
import { ChangeDetectionStrategy, Component } from '@angular/core';

import { NgIcon, provideIcons } from '@ng-icons/core';
import { lucideBuilding2, lucideCreditCard, lucideWallet } from '@ng-icons/lucide';

import { ZardButtonComponent } from '@/shared/components/button';
import { ZardDropdownImports } from '@/shared/components/dropdown/dropdown.imports';

@Component({
  selector: 'z-demo-dropdown-radio-icons',
  imports: [ZardDropdownImports, ZardButtonComponent, NgIcon],
  template: `
    <button type="button" z-button zType="outline" z-dropdown [zDropdownMenu]="menu">Payment Method</button>

    <z-dropdown-menu-content #menu="zDropdownMenuContent" class="w-56">
      <z-dropdown-menu-label>Select Payment Method</z-dropdown-menu-label>
      <z-dropdown-menu-radio-group [(zValue)]="selected">
        <z-dropdown-menu-radio-item zValue="card">
          <ng-icon name="lucideCreditCard" class="mr-2 size-4" />
          Credit Card
        </z-dropdown-menu-radio-item>
        <z-dropdown-menu-radio-item zValue="paypal">
          <ng-icon name="lucideWallet" class="mr-2 size-4" />
          PayPal
        </z-dropdown-menu-radio-item>
        <z-dropdown-menu-radio-item zValue="bank">
          <ng-icon name="lucideBuilding2" class="mr-2 size-4" />
          Bank Transfer
        </z-dropdown-menu-radio-item>
      </z-dropdown-menu-radio-group>
    </z-dropdown-menu-content>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
  viewProviders: [provideIcons({ lucideCreditCard, lucideWallet, lucideBuilding2 })],
})
export class ZardDemoDropdownRadioIconsComponent {
  selected = 'card';
}

destructive

Use zType="destructive" to style a row as destructive.
import { ChangeDetectionStrategy, Component } from '@angular/core';

import { ZardButtonComponent } from '@/shared/components/button';
import { ZardDropdownImports } from '@/shared/components/dropdown/dropdown.imports';

@Component({
  selector: 'z-demo-dropdown-destructive',
  imports: [ZardDropdownImports, ZardButtonComponent],
  template: `
    <button type="button" z-button zType="outline" z-dropdown [zDropdownMenu]="menu">Project</button>

    <z-dropdown-menu-content #menu="zDropdownMenuContent" class="w-48">
      <z-dropdown-menu-item (click)="log('Rename')">Rename</z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Duplicate')">Duplicate</z-dropdown-menu-item>
      <z-dropdown-menu-separator />
      <z-dropdown-menu-item zType="destructive" (click)="log('Delete')">Delete</z-dropdown-menu-item>
    </z-dropdown-menu-content>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ZardDemoDropdownDestructiveComponent {
  log(item: string) {
    console.log(`${item} clicked`);
  }
}

avatar

Compose with z-avatar for an account menu triggered from the user's picture.
import { ChangeDetectionStrategy, Component } from '@angular/core';

import { ZardAvatarComponent } from '@/shared/components/avatar/avatar.component';
import { ZardButtonComponent } from '@/shared/components/button';
import { ZardDropdownImports } from '@/shared/components/dropdown/dropdown.imports';

@Component({
  selector: 'z-demo-dropdown-avatar',
  imports: [ZardDropdownImports, ZardButtonComponent, ZardAvatarComponent],
  template: `
    <button type="button" z-button zType="ghost" class="size-10 rounded-full p-0" z-dropdown [zDropdownMenu]="menu">
      <z-avatar zSrc="/images/avatar/imgs/avatar_image.jpg" zFallback="ZA" zAlt="User avatar" />
    </button>

    <z-dropdown-menu-content #menu="zDropdownMenuContent" class="w-56">
      <z-dropdown-menu-label>
        <div class="flex flex-col space-y-1">
          <p class="text-sm leading-none font-medium">Zard User</p>
          <p class="text-muted-foreground text-xs leading-none">user@zardui.com</p>
        </div>
      </z-dropdown-menu-label>
      <z-dropdown-menu-separator />
      <z-dropdown-menu-item (click)="log('Profile')">Profile</z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Billing')">Billing</z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Settings')">Settings</z-dropdown-menu-item>
      <z-dropdown-menu-separator />
      <z-dropdown-menu-item (click)="log('Log out')">Log out</z-dropdown-menu-item>
    </z-dropdown-menu-content>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ZardDemoDropdownAvatarComponent {
  log(item: string) {
    console.log(`${item} clicked`);
  }
}

complex

Groups, shortcuts, separators and a disabled row combined in one menu.
import { ChangeDetectionStrategy, Component } from '@angular/core';

import { ZardButtonComponent } from '@/shared/components/button';
import { ZardDropdownImports } from '@/shared/components/dropdown/dropdown.imports';

@Component({
  selector: 'z-demo-dropdown-complex',
  imports: [ZardDropdownImports, ZardButtonComponent],
  template: `
    <button type="button" z-button zType="outline" z-dropdown [zDropdownMenu]="menu">Open</button>

    <z-dropdown-menu-content #menu="zDropdownMenuContent" class="w-56">
      <z-dropdown-menu-label>My Account</z-dropdown-menu-label>
      <z-dropdown-menu-item (click)="log('Profile')">
        Profile
        <z-dropdown-menu-shortcut>⇧⌘P</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Billing')">
        Billing
        <z-dropdown-menu-shortcut>⌘B</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Settings')">
        Settings
        <z-dropdown-menu-shortcut>⌘S</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Keyboard shortcuts')">
        Keyboard shortcuts
        <z-dropdown-menu-shortcut>⌘K</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>
      <z-dropdown-menu-separator />
      <z-dropdown-menu-item (click)="log('Team')">Team</z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('New Team')">
        New Team
        <z-dropdown-menu-shortcut>⌘+T</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>
      <z-dropdown-menu-separator />
      <z-dropdown-menu-item (click)="log('GitHub')">GitHub</z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Support')">Support</z-dropdown-menu-item>
      <z-dropdown-menu-item [disabled]="true">API</z-dropdown-menu-item>
      <z-dropdown-menu-separator />
      <z-dropdown-menu-item (click)="log('Log out')">
        Log out
        <z-dropdown-menu-shortcut>⇧⌘Q</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>
    </z-dropdown-menu-content>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ZardDemoDropdownComplexComponent {
  log(item: string) {
    console.log(`${item} clicked`);
  }
}

hover

Use zTrigger="hover" when the menu should open on pointer hover.
import { ChangeDetectionStrategy, Component } from '@angular/core';

import { ZardButtonComponent } from '@/shared/components/button';
import { ZardDropdownImports } from '@/shared/components/dropdown/dropdown.imports';

@Component({
  selector: 'z-demo-dropdown-hover',
  imports: [ZardDropdownImports, ZardButtonComponent],
  template: `
    <button type="button" z-button zType="outline" zTrigger="hover" z-dropdown [zDropdownMenu]="menu">Open</button>

    <z-dropdown-menu-content #menu="zDropdownMenuContent" class="w-56">
      <z-dropdown-menu-label>My Account</z-dropdown-menu-label>

      <z-dropdown-menu-item (click)="onProfile()">
        Profile
        <z-dropdown-menu-shortcut>⇧⌘P</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>

      <z-dropdown-menu-item (click)="onBilling()">
        Billing
        <z-dropdown-menu-shortcut>⌘B</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>

      <z-dropdown-menu-item (click)="onSettings()">
        Settings
        <z-dropdown-menu-shortcut>⌘S</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>

      <z-dropdown-menu-item (click)="onKeyboardShortcuts()">
        Keyboard shortcuts
        <z-dropdown-menu-shortcut>⌘K</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>

      <z-dropdown-menu-separator />

      <z-dropdown-menu-item (click)="onTeam()">Team</z-dropdown-menu-item>

      <z-dropdown-menu-item (click)="onNewTeam()">
        New Team
        <z-dropdown-menu-shortcut>⌘+T</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>

      <z-dropdown-menu-separator />

      <z-dropdown-menu-item (click)="onGitHub()">GitHub</z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="onSupport()">Support</z-dropdown-menu-item>
      <z-dropdown-menu-item [disabled]="true">API</z-dropdown-menu-item>

      <z-dropdown-menu-separator />

      <z-dropdown-menu-item (click)="onLogout()">
        Log out
        <z-dropdown-menu-shortcut>⇧⌘Q</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>
    </z-dropdown-menu-content>
  `,
  changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ZardDemoDropdownHoverComponent {
  onProfile() {
    console.log('Profile clicked');
  }

  onBilling() {
    console.log('Billing clicked');
  }

  onSettings() {
    console.log('Settings clicked');
  }

  onKeyboardShortcuts() {
    console.log('Keyboard shortcuts clicked');
  }

  onTeam() {
    console.log('Team clicked');
  }

  onNewTeam() {
    console.log('New Team clicked');
  }

  onGitHub() {
    console.log('GitHub clicked');
  }

  onSupport() {
    console.log('Support clicked');
  }

  onLogout() {
    console.log('Log out clicked');
  }
}

API Reference

[z-dropdown]Component

Trigger directive. Opens the linked `z-dropdown-menu-content` next to the element it is set on.

PropertyDescriptionTypeDefault
[zDropdownMenu] The `z-dropdown-menu-content` to open, exported as `zDropdownMenuContent`. ZardDropdownMenuContentComponent -
[zTrigger] Interaction that opens the dropdown. 'click' | 'hover' 'click'
[zDisabled] Disables the trigger. boolean false

z-dropdown-menuComponent

Self-contained alternative to `[z-dropdown]`: trigger and overlay in one element, with the trigger projected through `[dropdown-trigger]` and the rows as default content. Use it when the menu never needs to be opened from anywhere but its own trigger.

PropertyDescriptionTypeDefault
(openChange) Emitted when the menu opens or closes. boolean —
[class] Additional CSS classes ClassValue ''
[disabled] Disables the dropdown. boolean false
[zDisabled] Disables the dropdown using the Zard-prefixed API. boolean false

z-dropdown-menu-contentComponent

The menu surface opened by `[z-dropdown]`. Every row primitive below is declared inside it. Placement follows `zSide`/`zAlign`/`zSideOffset` relative to the trigger — the same vocabulary Radix uses for `DropdownMenuContent` — because a dropdown, unlike a context menu, always has an anchor element to be a side or an alignment of.

PropertyDescriptionTypeDefault
[class] Additional CSS classes ClassValue ''
[zSide] Edge of the trigger the menu opens from. Same meaning as Radix's `side`. 'top' | 'right' | 'bottom' | 'left' 'bottom'
[zAlign] Alignment of the menu along that edge. Same meaning as Radix's `align`. 'start' | 'center' | 'end' 'start'
[zSideOffset] Gap between trigger and menu, in pixels. Same meaning as Radix's `sideOffset`. number 4

z-dropdown-menu-groupComponent

Groups related rows under a shared label.

PropertyDescriptionTypeDefault
[class] Additional CSS classes ClassValue ''

z-dropdown-menu-labelComponent

Label naming a group of rows.

PropertyDescriptionTypeDefault
[inset] Adds left padding for alignment. boolean false
[class] Additional CSS classes ClassValue ''

z-dropdown-menu-itemComponent

Clickable menu row that closes the dropdown after selection. `variant` and `zVariant` are also accepted, as shadcn-compatibility aliases for `zType` — `zType` is the documented, canonical name.

PropertyDescriptionTypeDefault
[zType] Visual type of the item. 'default' | 'destructive' 'default'
[zInset] Adds left padding for alignment. boolean false
[inset] Adds left padding for alignment. boolean false
[zDisabled] Disables the item. boolean false
[disabled] Disables the item. boolean false
[class] Additional CSS classes ClassValue ''

z-dropdown-menu-separatorComponent

Divider between menu sections.

PropertyDescriptionTypeDefault
[class] Additional CSS classes ClassValue ''

z-dropdown-menu-shortcutComponent

Right-aligned keyboard hint inside a menu row.

PropertyDescriptionTypeDefault
[class] Additional CSS classes ClassValue ''

z-dropdown-menu-checkbox-itemComponent

Menu row with a checked state and `menuitemcheckbox` semantics. `variant` and `zVariant` are also accepted, as shadcn-compatibility aliases for `zType` — `zType` is the documented, canonical name.

PropertyDescriptionTypeDefault
[zChecked] Checked state, two-way bindable. boolean false
[(zChecked)] Checked state (two-way binding). boolean false
[zDisabled] Disables the item. boolean false
[disabled] Disables the item. boolean false
[zType] Visual type of the item. 'default' | 'destructive' 'default'
[class] Additional CSS classes ClassValue ''

z-dropdown-menu-radio-groupComponent

Radio group wrapper for menu radio items.

PropertyDescriptionTypeDefault
[zValue] Selected radio item value, two-way bindable. string | undefined undefined
[(zValue)] Selected radio item value (two-way binding). string | undefined undefined
[class] Additional CSS classes ClassValue ''

z-dropdown-menu-radio-itemComponent

Menu row with `menuitemradio` semantics. `variant` and `zVariant` are also accepted, as shadcn-compatibility aliases for `zType` — `zType` is the documented, canonical name.

PropertyDescriptionTypeDefault
[zValue] Value represented by this radio item. string -
[zDisabled] Disables the item. boolean false
[disabled] Disables the item. boolean false
[zType] Visual type of the item. 'default' | 'destructive' 'default'
[class] Additional CSS classes ClassValue ''

z-dropdown-menu-sub-triggerComponent

Menu row that opens a nested menu to its side, on hover, click or `ArrowRight`.

PropertyDescriptionTypeDefault
[zSubMenu] Submenu content, exported as `zDropdownMenuSubContent`. ZardDropdownMenuSubContentComponent | TemplateRef<unknown> -
[zInset] Adds left padding for alignment. boolean false
[zDisabled] Disables the sub-trigger. boolean false
[class] Additional CSS classes ClassValue ''

z-dropdown-menu-sub-contentComponent

Surface of a submenu. Declared next to its sub-trigger and referenced by it. It has no `side`/`align` inputs — the submenu always opens beside its trigger and flips to the opposite side when the preferred one runs out of room, the same automatic behaviour a native OS submenu has.

PropertyDescriptionTypeDefault
[class] Additional CSS classes ClassValue ''
github iconwhatsapp icondiscord iconX icon

Made with ❤ in Brazil. Open source and available on GitHub .