Skip to content

Dropdown Menu

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

Installation

bash
npx @galaxy-stack/nebula-cli@latest add dropdown-menu
bash
pnpm dlx @galaxy-stack/nebula-cli@latest add dropdown-menu
bash
yarn dlx @galaxy-stack/nebula-cli@latest add dropdown-menu
bash
bunx @galaxy-stack/nebula-cli@latest add dropdown-menu
bash
# If you have installed galaxy-design globally
galaxy-design add dropdown-menu

Usage

API Reference

Props

PropTypeDefaultDescriptionFrameworks
openbooleanundefinedControlled open stateReact, Vue, Angular
defaultOpenbooleanfalseUncontrolled initial open stateAll
onOpenChange(open: boolean) => void-Called when open state changesReact, Vue, Angular
modalbooleantrueWhether dropdown is modalAll
dir'ltr' | 'rtl''ltr'Reading directionReact, Vue, Angular
classNamestring''CSS class namesReact, React Native
classstring''CSS class namesVue, Angular, Flutter

Subcomponents

PropTypeDefaultDescriptionFrameworks
asChildbooleanfalseRender as child elementReact, Vue, Angular
disabledbooleanfalseDisables the triggerAll
classNamestring''CSS class namesReact, React Native
classstring''CSS class namesVue, Angular, Flutter
PropTypeDefaultDescriptionFrameworks
side'top' | 'bottom' | 'left' | 'right''bottom'Side to render contentReact, Vue, Angular
sideOffsetnumber4Offset from sideReact, Vue, Angular
align'start' | 'center' | 'end''center'Alignment along sideReact, Vue, Angular
asChildbooleanfalseRender as child elementReact, Vue, Angular
classNamestring''CSS class namesReact, React Native
classstring''CSS class namesVue, Angular, Flutter
PropTypeDefaultDescriptionFrameworks
disabledbooleanfalseDisables the itemAll
asChildbooleanfalseRender as child elementReact, Vue, Angular
classNamestring''CSS class namesReact, React Native
classstring''CSS class namesVue, Angular, Flutter
PropTypeDefaultDescriptionFrameworks
classNamestring''CSS class namesReact, React Native
classstring''CSS class namesVue, Angular, Flutter
PropTypeDefaultDescriptionFrameworks
insetbooleanfalseWhether label is insetReact, Vue, Angular
classNamestring''CSS class namesReact, React Native
classstring''CSS class namesVue, Angular, Flutter

Vue

vue
<script setup lang="ts">
import {
  DropdownMenu,
  DropdownMenuTrigger,
  DropdownMenuContent,
  DropdownMenuItem
} from '@/components/ui'
import { Button } from '@/components/ui'
</script>

<template>
  <DropdownMenu>
    <DropdownMenuTrigger as-child>
      <Button variant="outline">Open</Button>
    </DropdownMenuTrigger>
    <DropdownMenuContent>
      <DropdownMenuItem>Profile</DropdownMenuItem>
      <DropdownMenuItem>Settings</DropdownMenuItem>
      <DropdownMenuItem>Logout</DropdownMenuItem>
    </DropdownMenuContent>
  </DropdownMenu>
</template>

React

tsx
import {
  DropdownMenu,
  DropdownMenuTrigger,
  DropdownMenuContent,
  DropdownMenuItem
} from '@/components/ui'
import { Button } from '@/components/ui'

export default function DropdownMenuDemo() {
  return (
    <DropdownMenu>
      <DropdownMenuTrigger asChild>
        <Button variant="outline">Open</Button>
      </DropdownMenuTrigger>
      <DropdownMenuContent>
        <DropdownMenuItem>Profile</DropdownMenuItem>
        <DropdownMenuItem>Settings</DropdownMenuItem>
        <DropdownMenuItem>Logout</DropdownMenuItem>
      </DropdownMenuContent>
    </DropdownMenu>
  )
}

Angular

typescript
import { Component } from '@angular/core';
import { DropdownMenuComponent, DropdownMenuItemComponent } from '@/components/ui';
import { ButtonComponent } from '@/components/ui';

@Component({
  selector: 'app-dropdown-menu-demo',
  standalone: true,
  imports: [DropdownMenuComponent, DropdownMenuItemComponent, ButtonComponent],
  template: `
    <ui-dropdown-menu [isOpen]="isOpen" (openChange)="isOpen = $event">
      <ui-button trigger variant="outline" (click)="isOpen = !isOpen">Open</ui-button>
      <div content>
        <ui-dropdown-menu-item>Profile</ui-dropdown-menu-item>
        <ui-dropdown-menu-item>Settings</ui-dropdown-menu-item>
        <ui-dropdown-menu-item>Logout</ui-dropdown-menu-item>
      </div>
    </ui-dropdown-menu>
  `
})
export class DropdownMenuDemoComponent {
  isOpen = false;
}

Accessibility

  • Keyboard Navigation: [TODO]
  • Screen Reader: [TODO]
  • Focus Management: [TODO]
  • WCAG Compliance: WCAG 2.1 Level AA compliant

Author

Bùi Trọng Hiếu (kevinbui)

License

MIT © 2025 Bùi Trọng Hiếu (kevinbui)

Released under the MIT License.