dropdown

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

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

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

@Component({
  selector: 'z-dropdown-demo',
  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-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-item [disabled]="true">Subscription</z-dropdown-menu-item>
    </z-dropdown-menu-content>
  `,
})
export class ZardDropdownDemoComponent {
  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

import { Component } from '@angular/core';

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

@Component({
  selector: 'z-dropdown-demo',
  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-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-item [disabled]="true">Subscription</z-dropdown-menu-item>
    </z-dropdown-menu-content>
  `,
})
export class ZardDropdownDemoComponent {
  log(item: string) {
    console.log(`${item} clicked`);
  }
}

shortcuts

import { Component } from '@angular/core';

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

@Component({
  selector: 'z-dropdown-shortcuts-demo',
  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>
  `,
})
export class ZardDropdownShortcutsDemoComponent {
  log(item: string) {
    console.log(`${item} clicked`);
  }
}

icons

import { 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-dropdown-icons-demo',
  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>
  `,
  viewProviders: [provideIcons({ lucideUser, lucideCreditCard, lucideSettings, lucideKeyboard })],
})
export class ZardDropdownIconsDemoComponent {
  log(item: string) {
    console.log(`${item} clicked`);
  }
}

checkboxes

import { Component } from '@angular/core';

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

@Component({
  selector: 'z-dropdown-checkboxes-demo',
  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>
  `,
})
export class ZardDropdownCheckboxesDemoComponent {
  statusBar = true;
  activityBar = false;
  panel = false;
}

radio group

import { Component } from '@angular/core';

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

@Component({
  selector: 'z-dropdown-radio-group-demo',
  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>
  `,
})
export class ZardDropdownRadioGroupDemoComponent {
  selected = 'bottom';
  positions = [
    { value: 'top', label: 'Top' },
    { value: 'bottom', label: 'Bottom' },
    { value: 'right', label: 'Right' },
  ];
}

destructive

import { Component } from '@angular/core';

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

@Component({
  selector: 'z-dropdown-destructive-demo',
  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>
  `,
})
export class ZardDropdownDestructiveDemoComponent {
  log(item: string) {
    console.log(`${item} clicked`);
  }
}

submenu

Compose with z-menu for nested flyout behavior.

import { Component } from '@angular/core';

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

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

@Component({
  selector: 'z-dropdown-submenu-demo',
  imports: [ZardDropdownImports, ZardButtonComponent, ZardMenuImports, 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('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 />
      <button type="button" z-menu-item z-menu [zMenuTriggerFor]="moreToolsMenu" zPlacement="rightTop">
        More Tools
        <ng-icon name="lucideChevronRight" class="ml-auto size-4" />
      </button>
    </z-dropdown-menu-content>

    <ng-template #moreToolsMenu>
      <div z-menu-content class="w-48">
        <button type="button" z-menu-item (click)="log('Save Page As')">Save Page As...</button>
        <button type="button" z-menu-item (click)="log('Create Shortcut')">Create Shortcut...</button>
        <button type="button" z-menu-item (click)="log('Developer Tools')">Developer Tools</button>
      </div>
    </ng-template>
  `,
  viewProviders: [provideIcons({ lucideChevronRight })],
})
export class ZardDropdownSubmenuDemoComponent {
  log(item: string) {
    console.log(`${item} clicked`);
  }
}

avatar

import { 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-dropdown-avatar-demo',
  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>
  `,
})
export class ZardDropdownAvatarDemoComponent {
  log(item: string) {
    console.log(`${item} clicked`);
  }
}

complex

import { Component } from '@angular/core';

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

@Component({
  selector: 'z-dropdown-complex-demo',
  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>
  `,
})
export class ZardDropdownComplexDemoComponent {
  log(item: string) {
    console.log(`${item} clicked`);
  }
}

hover

Use zTrigger="hover" when the menu should open on pointer hover.

import { Component } from '@angular/core';

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

@Component({
  selector: 'z-dropdown-hover-demo',
  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>
  `,
})
export class ZardDropdownHoverDemoComponent {
  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-dropdownComponent

Trigger directive that opens a linked dropdown menu content template.

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

z-dropdown-menuComponent

Projected dropdown component with built-in trigger and overlay management.

PropertyDescriptionTypeDefault
[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

Reusable content template displayed by a `z-dropdown` trigger.

PropertyDescriptionTypeDefault
[class] Additional CSS classes ClassValue ''

z-dropdown-menu-itemComponent

Clickable menu item that closes the dropdown after selection.

PropertyDescriptionTypeDefault
[zType] Visual type of the item. 'default' | 'destructive' 'default'
[variant] Visual variant 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 dropdown item. boolean false
[disabled] Disables the dropdown item boolean false
[class] Additional CSS classes ClassValue ''

z-dropdown-menu-labelComponent

Label for grouping dropdown menu items.

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

z-dropdown-menu-separatorComponent

Visual separator between dropdown menu sections.

PropertyDescriptionTypeDefault
[class] Additional CSS classes ClassValue ''

z-dropdown-menu-shortcutComponent

Right-aligned shortcut text inside a dropdown menu item.

PropertyDescriptionTypeDefault
[class] Additional CSS classes ClassValue ''

z-dropdown-menu-checkbox-itemComponent

Checkbox-style dropdown menu item with checked state and menuitemcheckbox semantics.

PropertyDescriptionTypeDefault
[(zChecked)] Checked state for the checkbox item. boolean false
[zDisabled] Disables the checkbox 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 dropdown menu radio items.

PropertyDescriptionTypeDefault
[(zValue)] Selected radio item value. string | undefined undefined
[class] Additional CSS classes ClassValue ''

z-dropdown-menu-radio-itemComponent

Radio-style dropdown menu item with menuitemradio semantics.

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

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