context menu

Displays a menu of actions triggered by a right click.

PreviousNext
Right click here
import { Component, signal } from '@angular/core';

import { ZardContextMenuImports } from '@/shared/components/context-menu/context-menu.imports';

@Component({
  selector: 'z-context-menu-demo',
  imports: [ZardContextMenuImports],
  template: `
    <div
      z-context-menu
      [zContextMenuTriggerFor]="menu"
      class="flex aspect-video w-full max-w-xs items-center justify-center rounded-xl border border-dashed text-sm"
    >
      Right click here
    </div>

    <z-dropdown-menu-content #menu="zDropdownMenuContent" class="w-52">
      <z-dropdown-menu-item (click)="log('Back')">
        Back
        <z-dropdown-menu-shortcut>⌘[</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>
      <z-dropdown-menu-item zDisabled>
        Forward
        <z-dropdown-menu-shortcut>⌘]</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Reload')">
        Reload
        <z-dropdown-menu-shortcut>⌘R</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>

      <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')">Save Page...</z-dropdown-menu-item>
        <z-dropdown-menu-item (click)="log('Create Shortcut')">Create Shortcut...</z-dropdown-menu-item>
        <z-dropdown-menu-item (click)="log('Name Window')">Name Window...</z-dropdown-menu-item>
        <z-dropdown-menu-separator />
        <z-dropdown-menu-item (click)="log('Developer Tools')">Developer Tools</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-sub-content>

      <z-dropdown-menu-separator />
      <z-dropdown-menu-checkbox-item [(zChecked)]="showBookmarks">Show Bookmarks</z-dropdown-menu-checkbox-item>
      <z-dropdown-menu-checkbox-item [(zChecked)]="showFullUrls">Show Full URLs</z-dropdown-menu-checkbox-item>
      <z-dropdown-menu-separator />
      <z-dropdown-menu-radio-group [(zValue)]="person">
        <z-dropdown-menu-label>People</z-dropdown-menu-label>
        <z-dropdown-menu-radio-item zValue="pedro">Pedro Duarte</z-dropdown-menu-radio-item>
        <z-dropdown-menu-radio-item zValue="colm">Colm Tuite</z-dropdown-menu-radio-item>
      </z-dropdown-menu-radio-group>
    </z-dropdown-menu-content>
  `,
  host: { class: 'contents' },
})
export class ZardContextMenuDemoComponent {
  readonly showBookmarks = signal(true);
  readonly showFullUrls = signal(false);
  readonly person = signal('pedro');

  log(item: string) {
    console.log(`${item} clicked`);
  }
}

About

The menu surface and every row are the dropdown primitives, so one vocabulary covers the dropdown and the context menu. The trigger is declarative for the common case; for the dynamic one — a single menu serving many rows — inject the service, mirroring ng-zorro's NzContextMenuService

Installation

Copy
npx zard-cli@latest add context-menu

Usage

import { ZardContextMenuImports } from '@/shared/components/context-menu/context-menu.imports';
Copy
<div z-context-menu [zContextMenuTriggerFor]="menu">Right click here</div>

<z-dropdown-menu-content #menu="zDropdownMenuContent" class="w-48">
  <z-dropdown-menu-item>Back</z-dropdown-menu-item>
  <z-dropdown-menu-item>Reload</z-dropdown-menu-item>
  <z-dropdown-menu-separator />
  <z-dropdown-menu-item zType="destructive">Delete</z-dropdown-menu-item>
</z-dropdown-menu-content>
Copy

Composition

Use the following composition to build a context-menu:

div[z-context-menu]
└── z-dropdown-menu-content
    ├── z-dropdown-menu-group
    │   ├── z-dropdown-menu-label
    │   └── z-dropdown-menu-item
    │       └── z-dropdown-menu-shortcut
    ├── z-dropdown-menu-sub-trigger
    ├── z-dropdown-menu-sub-content
    │   └── z-dropdown-menu-item
    ├── z-dropdown-menu-separator
    ├── z-dropdown-menu-checkbox-item
    ├── z-dropdown-menu-separator
    └── z-dropdown-menu-radio-group
        ├── z-dropdown-menu-label
        └── z-dropdown-menu-radio-item
Copy

Examples

basic

A few actions, one of them disabled. Right click the area to open the menu.
Right click here
import { Component } from '@angular/core';

import { ZardContextMenuImports } from '@/shared/components/context-menu/context-menu.imports';

@Component({
  selector: 'z-context-menu-basic-demo',
  imports: [ZardContextMenuImports],
  template: `
    <div
      z-context-menu
      [zContextMenuTriggerFor]="menu"
      class="flex aspect-video w-full max-w-xs items-center justify-center rounded-xl border border-dashed text-sm"
    >
      Right click here
    </div>

    <z-dropdown-menu-content #menu="zDropdownMenuContent" class="w-40">
      <z-dropdown-menu-item (click)="log('Back')">Back</z-dropdown-menu-item>
      <z-dropdown-menu-item zDisabled>Forward</z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Reload')">Reload</z-dropdown-menu-item>
    </z-dropdown-menu-content>
  `,
  host: { class: 'contents' },
})
export class ZardContextMenuBasicDemoComponent {
  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.
Right click here
import { Component } from '@angular/core';

import { ZardContextMenuImports } from '@/shared/components/context-menu/context-menu.imports';

@Component({
  selector: 'z-context-menu-submenu-demo',
  imports: [ZardContextMenuImports],
  template: `
    <div
      z-context-menu
      [zContextMenuTriggerFor]="menu"
      class="flex aspect-video w-full max-w-xs items-center justify-center rounded-xl border border-dashed text-sm"
    >
      Right click here
    </div>

    <z-dropdown-menu-content #menu="zDropdownMenuContent" class="w-44">
      <z-dropdown-menu-item (click)="log('Copy')">
        Copy
        <z-dropdown-menu-shortcut>⌘C</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Cut')">
        Cut
        <z-dropdown-menu-shortcut>⌘X</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>

      <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')">Save Page...</z-dropdown-menu-item>
        <z-dropdown-menu-item (click)="log('Create Shortcut')">Create Shortcut...</z-dropdown-menu-item>
        <z-dropdown-menu-item (click)="log('Name Window')">Name Window...</z-dropdown-menu-item>
        <z-dropdown-menu-separator />
        <z-dropdown-menu-item (click)="log('Developer Tools')">Developer Tools</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-sub-content>
    </z-dropdown-menu-content>
  `,
  host: { class: 'contents' },
})
export class ZardContextMenuSubmenuDemoComponent {
  log(item: string) {
    console.log(`${item} clicked`);
  }
}

shortcuts

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

import { ZardContextMenuImports } from '@/shared/components/context-menu/context-menu.imports';

@Component({
  selector: 'z-context-menu-shortcuts-demo',
  imports: [ZardContextMenuImports],
  template: `
    <div
      z-context-menu
      [zContextMenuTriggerFor]="menu"
      class="flex aspect-video w-full max-w-xs items-center justify-center rounded-xl border border-dashed text-sm"
    >
      Right click here
    </div>

    <z-dropdown-menu-content #menu="zDropdownMenuContent" class="w-44">
      <z-dropdown-menu-item (click)="log('Back')">
        Back
        <z-dropdown-menu-shortcut>⌘[</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>
      <z-dropdown-menu-item zDisabled>
        Forward
        <z-dropdown-menu-shortcut>⌘]</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Reload')">
        Reload
        <z-dropdown-menu-shortcut>⌘R</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>
      <z-dropdown-menu-separator />
      <z-dropdown-menu-item (click)="log('Save')">
        Save
        <z-dropdown-menu-shortcut>⌘S</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Save As')">
        Save As...
        <z-dropdown-menu-shortcut>⇧⌘S</z-dropdown-menu-shortcut>
      </z-dropdown-menu-item>
    </z-dropdown-menu-content>
  `,
  host: { class: 'contents' },
})
export class ZardContextMenuShortcutsDemoComponent {
  log(item: string) {
    console.log(`${item} clicked`);
  }
}

groups

Group related actions and separate them with dividers.
Right click here
import { Component } from '@angular/core';

import { ZardContextMenuImports } from '@/shared/components/context-menu/context-menu.imports';

@Component({
  selector: 'z-context-menu-groups-demo',
  imports: [ZardContextMenuImports],
  template: `
    <div
      z-context-menu
      [zContextMenuTriggerFor]="menu"
      class="flex aspect-video w-full max-w-xs items-center justify-center rounded-xl border border-dashed text-sm"
    >
      Right click here
    </div>

    <z-dropdown-menu-content #menu="zDropdownMenuContent" class="w-44">
      <z-dropdown-menu-group>
        <z-dropdown-menu-label>File</z-dropdown-menu-label>
        <z-dropdown-menu-item (click)="log('New File')">
          New File
          <z-dropdown-menu-shortcut>⌘N</z-dropdown-menu-shortcut>
        </z-dropdown-menu-item>
        <z-dropdown-menu-item (click)="log('Open File')">
          Open File
          <z-dropdown-menu-shortcut>⌘O</z-dropdown-menu-shortcut>
        </z-dropdown-menu-item>
      </z-dropdown-menu-group>
      <z-dropdown-menu-separator />
      <z-dropdown-menu-group>
        <z-dropdown-menu-label>Edit</z-dropdown-menu-label>
        <z-dropdown-menu-item (click)="log('Undo')">
          Undo
          <z-dropdown-menu-shortcut>⌘Z</z-dropdown-menu-shortcut>
        </z-dropdown-menu-item>
        <z-dropdown-menu-item (click)="log('Redo')">
          Redo
          <z-dropdown-menu-shortcut>⇧⌘Z</z-dropdown-menu-shortcut>
        </z-dropdown-menu-item>
      </z-dropdown-menu-group>
      <z-dropdown-menu-separator />
      <z-dropdown-menu-group>
        <z-dropdown-menu-item zType="destructive" (click)="log('Delete')">
          Delete
          <z-dropdown-menu-shortcut>⌫</z-dropdown-menu-shortcut>
        </z-dropdown-menu-item>
      </z-dropdown-menu-group>
    </z-dropdown-menu-content>
  `,
  host: { class: 'contents' },
})
export class ZardContextMenuGroupsDemoComponent {
  log(item: string) {
    console.log(`${item} clicked`);
  }
}

icons

Combine icons with labels for quick scanning.
Right click here
import { Component } from '@angular/core';

import { NgIcon, provideIcons } from '@ng-icons/core';
import { lucideClipboardPaste, lucideCopy, lucideScissors, lucideTrash2 } from '@ng-icons/lucide';

import { ZardContextMenuImports } from '@/shared/components/context-menu/context-menu.imports';

@Component({
  selector: 'z-context-menu-icons-demo',
  imports: [ZardContextMenuImports, NgIcon],
  template: `
    <div
      z-context-menu
      [zContextMenuTriggerFor]="menu"
      class="flex aspect-video w-full max-w-xs items-center justify-center rounded-xl border border-dashed text-sm"
    >
      Right click here
    </div>

    <z-dropdown-menu-content #menu="zDropdownMenuContent" class="w-40">
      <z-dropdown-menu-item (click)="log('Copy')">
        <ng-icon name="lucideCopy" class="text-muted-foreground" />
        Copy
      </z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Cut')">
        <ng-icon name="lucideScissors" class="text-muted-foreground" />
        Cut
      </z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Paste')">
        <ng-icon name="lucideClipboardPaste" class="text-muted-foreground" />
        Paste
      </z-dropdown-menu-item>
      <z-dropdown-menu-separator />
      <z-dropdown-menu-item zType="destructive" (click)="log('Delete')">
        <ng-icon name="lucideTrash2" />
        Delete
      </z-dropdown-menu-item>
    </z-dropdown-menu-content>
  `,
  viewProviders: [provideIcons({ lucideClipboardPaste, lucideCopy, lucideScissors, lucideTrash2 })],
  host: { class: 'contents' },
})
export class ZardContextMenuIconsDemoComponent {
  log(item: string) {
    console.log(`${item} clicked`);
  }
}

checkboxes

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

import { ZardContextMenuImports } from '@/shared/components/context-menu/context-menu.imports';

@Component({
  selector: 'z-context-menu-checkboxes-demo',
  imports: [ZardContextMenuImports],
  template: `
    <div
      z-context-menu
      [zContextMenuTriggerFor]="menu"
      class="flex aspect-video w-full max-w-xs items-center justify-center rounded-xl border border-dashed text-sm"
    >
      Right click here
    </div>

    <z-dropdown-menu-content #menu="zDropdownMenuContent" class="w-52">
      <z-dropdown-menu-checkbox-item [(zChecked)]="showBookmarksBar">Show Bookmarks Bar</z-dropdown-menu-checkbox-item>
      <z-dropdown-menu-checkbox-item [(zChecked)]="showFullUrls">Show Full URLs</z-dropdown-menu-checkbox-item>
      <z-dropdown-menu-checkbox-item [(zChecked)]="showDeveloperTools">
        Show Developer Tools
      </z-dropdown-menu-checkbox-item>
    </z-dropdown-menu-content>
  `,
  host: { class: 'contents' },
})
export class ZardContextMenuCheckboxesDemoComponent {
  readonly showBookmarksBar = signal(true);
  readonly showFullUrls = signal(false);
  readonly showDeveloperTools = signal(true);
}

radio

Use z-dropdown-menu-radio-item for exclusive choices.
Right click here
import { Component, signal } from '@angular/core';

import { ZardContextMenuImports } from '@/shared/components/context-menu/context-menu.imports';

@Component({
  selector: 'z-context-menu-radio-demo',
  imports: [ZardContextMenuImports],
  template: `
    <div
      z-context-menu
      [zContextMenuTriggerFor]="menu"
      class="flex aspect-video w-full max-w-xs items-center justify-center rounded-xl border border-dashed text-sm"
    >
      Right click here
    </div>

    <z-dropdown-menu-content #menu="zDropdownMenuContent" class="w-44">
      <z-dropdown-menu-radio-group [(zValue)]="person">
        <z-dropdown-menu-label>People</z-dropdown-menu-label>
        <z-dropdown-menu-radio-item zValue="pedro">Pedro Duarte</z-dropdown-menu-radio-item>
        <z-dropdown-menu-radio-item zValue="colm">Colm Tuite</z-dropdown-menu-radio-item>
      </z-dropdown-menu-radio-group>
      <z-dropdown-menu-separator />
      <z-dropdown-menu-radio-group [(zValue)]="theme">
        <z-dropdown-menu-label>Theme</z-dropdown-menu-label>
        <z-dropdown-menu-radio-item zValue="light">Light</z-dropdown-menu-radio-item>
        <z-dropdown-menu-radio-item zValue="dark">Dark</z-dropdown-menu-radio-item>
        <z-dropdown-menu-radio-item zValue="system">System</z-dropdown-menu-radio-item>
      </z-dropdown-menu-radio-group>
    </z-dropdown-menu-content>
  `,
  host: { class: 'contents' },
})
export class ZardContextMenuRadioDemoComponent {
  readonly person = signal('pedro');
  readonly theme = signal('light');
}

destructive

Use zType="destructive" to style the row as destructive.
Right click here
import { Component } from '@angular/core';

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

import { ZardContextMenuImports } from '@/shared/components/context-menu/context-menu.imports';

@Component({
  selector: 'z-context-menu-destructive-demo',
  imports: [ZardContextMenuImports, NgIcon],
  template: `
    <div
      z-context-menu
      [zContextMenuTriggerFor]="menu"
      class="flex aspect-video w-full max-w-xs items-center justify-center rounded-xl border border-dashed text-sm"
    >
      Right click here
    </div>

    <z-dropdown-menu-content #menu="zDropdownMenuContent" class="w-40">
      <z-dropdown-menu-item (click)="log('Edit')">
        <ng-icon name="lucidePencil" class="text-muted-foreground" />
        Edit
      </z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="log('Share')">
        <ng-icon name="lucideShare" class="text-muted-foreground" />
        Share
      </z-dropdown-menu-item>
      <z-dropdown-menu-separator />
      <z-dropdown-menu-item zType="destructive" (click)="log('Delete')">
        <ng-icon name="lucideTrash2" />
        Delete
      </z-dropdown-menu-item>
    </z-dropdown-menu-content>
  `,
  viewProviders: [provideIcons({ lucidePencil, lucideShare, lucideTrash2 })],
  host: { class: 'contents' },
})
export class ZardContextMenuDestructiveDemoComponent {
  log(item: string) {
    console.log(`${item} clicked`);
  }
}

table rows

One menu serving many rows: inject ZardContextMenuService and call create($event, menu) from the row that was clicked.
NameSize
invoice-2024.pdf 120 KB
roadmap.md pinned8 KB
logo.svg 2 KB

Right click a row.

import { Component, inject, signal, viewChild } from '@angular/core';

import { ZardContextMenuImports } from '@/shared/components/context-menu/context-menu.imports';
import { ZardContextMenuService } from '@/shared/components/context-menu/context-menu.service';
import { type ZardDropdownMenuContentComponent } from '@/shared/components/dropdown/dropdown-menu-content.component';
import { ZardTableImports } from '@/shared/components/table/table.imports';

interface FileRow {
  id: number;
  name: string;
  size: string;
  pinned: boolean;
}

@Component({
  selector: 'z-context-menu-table-rows-demo',
  imports: [ZardContextMenuImports, ZardTableImports],
  template: `
    <div class="w-full max-w-md">
      <table z-table>
        <thead z-table-header>
          <tr z-table-row>
            <th z-table-head>Name</th>
            <th z-table-head class="text-right">Size</th>
          </tr>
        </thead>
        <tbody z-table-body>
          @for (row of rows(); track row.id) {
            <tr z-table-row class="cursor-context-menu" (contextmenu)="openMenu($event, row)">
              <td z-table-cell>
                {{ row.name }}
                @if (row.pinned) {
                  <span class="text-muted-foreground ml-2 text-xs">pinned</span>
                }
              </td>
              <td z-table-cell class="text-right">{{ row.size }}</td>
            </tr>
          }
        </tbody>
      </table>
      <p class="text-muted-foreground mt-3 text-sm">Right click a row.</p>
    </div>

    <z-dropdown-menu-content #rowMenu="zDropdownMenuContent" class="w-44">
      <z-dropdown-menu-label>{{ selected()?.name }}</z-dropdown-menu-label>
      <z-dropdown-menu-separator />
      <z-dropdown-menu-item (click)="rename()">Rename</z-dropdown-menu-item>
      <z-dropdown-menu-item (click)="duplicate()">Duplicate</z-dropdown-menu-item>
      <z-dropdown-menu-checkbox-item [zChecked]="selected()?.pinned ?? false" (zCheckedChange)="togglePin()">
        Pin row
      </z-dropdown-menu-checkbox-item>
      <z-dropdown-menu-separator />
      <z-dropdown-menu-item zType="destructive" (click)="remove()">Delete</z-dropdown-menu-item>
    </z-dropdown-menu-content>
  `,
  host: { class: 'contents' },
})
export class ZardContextMenuTableRowsDemoComponent {
  private readonly contextMenu = inject(ZardContextMenuService);
  private readonly rowMenu = viewChild.required<ZardDropdownMenuContentComponent>('rowMenu');

  readonly rows = signal<FileRow[]>([
    { id: 1, name: 'invoice-2024.pdf', size: '120 KB', pinned: false },
    { id: 2, name: 'roadmap.md', size: '8 KB', pinned: true },
    { id: 3, name: 'logo.svg', size: '2 KB', pinned: false },
  ]);

  readonly selected = signal<FileRow | undefined>(undefined);

  openMenu(event: MouseEvent, row: FileRow) {
    event.preventDefault();
    this.selected.set(row);
    this.contextMenu.create(event, this.rowMenu());
  }

  rename() {
    console.log('rename', this.selected()?.name);
  }

  duplicate() {
    console.log('duplicate', this.selected()?.name);
  }

  togglePin() {
    const target = this.selected();
    if (!target) {
      return;
    }

    this.rows.update(rows => rows.map(row => (row.id === target.id ? { ...row, pinned: !row.pinned } : row)));
    this.selected.update(row => (row ? { ...row, pinned: !row.pinned } : row));
  }

  remove() {
    const target = this.selected();
    if (!target) {
      return;
    }

    this.rows.update(rows => rows.filter(row => row.id !== target.id));
  }
}

disabled

With zDisabled the trigger stands down and the browser shows its own menu.
Right click for the browser menu
import { Component } from '@angular/core';

import { ZardContextMenuImports } from '@/shared/components/context-menu/context-menu.imports';

@Component({
  selector: 'z-context-menu-disabled-demo',
  imports: [ZardContextMenuImports],
  template: `
    <div
      z-context-menu
      zDisabled
      [zContextMenuTriggerFor]="menu"
      class="text-muted-foreground flex aspect-video w-full max-w-xs items-center justify-center rounded-xl border border-dashed text-sm"
    >
      Right click for the browser menu
    </div>

    <z-dropdown-menu-content #menu="zDropdownMenuContent" class="w-40">
      <z-dropdown-menu-item>Back</z-dropdown-menu-item>
      <z-dropdown-menu-item>Reload</z-dropdown-menu-item>
    </z-dropdown-menu-content>
  `,
  host: { class: 'contents' },
})
export class ZardContextMenuDisabledDemoComponent {}

API Reference

z-context-menuComponent

Trigger directive. Opens the linked menu at the pointer, replacing the browser menu.

PropertyDescriptionTypeDefault
[zContextMenuTriggerFor] Menu content opened at the pointer, exported as `zDropdownMenuContent`. ZardDropdownMenuContentComponent | TemplateRef<void> -
[zDisabled] Disables the trigger and restores the native browser menu. boolean false
(zVisibleChange) Emits when the menu opens or closes. EventEmitter<boolean> -

ZardContextMenuServiceComponent

Opens a menu at a pointer event or a coordinate, for one shared menu serving many rows. Injected with `inject(ZardContextMenuService)`.

PropertyDescriptionTypeDefault
create() Opens `menu` at the event or coordinate. Options take a `focusOrigin` and a `viewContainerRef`. (origin: MouseEvent | { x: number; y: number }, menu: ZardDropdownMenuContentComponent | TemplateRef<void>, options?: ZardContextMenuOptions) => void -
close() Closes the open context menu. () => void -
isOpen Whether a menu is currently on screen. Signal<boolean> false

z-dropdown-menu-contentComponent

The menu surface. Every item primitive below is declared inside it.

PropertyDescriptionTypeDefault
[class] Additional CSS classes ClassValue ''

z-dropdown-menu-itemComponent

Clickable menu row that closes the menu after selection.

PropertyDescriptionTypeDefault
[zType] Visual type of the item. 'default' | 'destructive' 'default'
[zInset] Adds left padding for alignment. boolean false
[zDisabled] Disables the item. boolean false
[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.

PropertyDescriptionTypeDefault
[class] Additional CSS classes ClassValue ''

z-dropdown-menu-checkbox-itemComponent

Menu row with a checked state and `menuitemcheckbox` semantics.

PropertyDescriptionTypeDefault
[(zChecked)] Checked state for the item. boolean false
[zDisabled] Disables the item. boolean false
[class] Additional CSS classes ClassValue ''

z-dropdown-menu-radio-groupComponent

Radio group wrapper for menu radio items.

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

z-dropdown-menu-radio-itemComponent

Menu row with `menuitemradio` semantics.

PropertyDescriptionTypeDefault
[zValue] Value represented by this radio item. string -
[zDisabled] Disables the item. boolean false
[class] Additional CSS classes ClassValue ''

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-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 ''
github iconwhatsapp icondiscord iconX icon

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