NovaUI
Components

Dropdown Menu

A menu triggered from a button that displays a list of actions or options.

The Dropdown Menu component provides a floating menu anchored to a trigger element. It supports items, checkbox items, radio items, sub-menus, labels, separators, and keyboard shortcuts. Built with React Native's Modal and Pressable for a native experience.

Preview

My Account
Profile⇧⌘P
Billing⌘B
Settings⌘S
Log out⇧⌘Q

Installation

npx novaui-cli add dropdown-menu

Import

import {
  DropdownMenu,
  DropdownMenuTrigger,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuCheckboxItem,
  DropdownMenuRadioItem,
  DropdownMenuLabel,
  DropdownMenuSeparator,
  DropdownMenuShortcut,
  DropdownMenuGroup,
  DropdownMenuPortal,
  DropdownMenuSub,
  DropdownMenuSubContent,
  DropdownMenuSubTrigger,
  DropdownMenuRadioGroup,
} from 'novaui-components'

Basic Usage

My Account
Profile⇧⌘P
Billing⌘B
Settings⌘S
Log out
import {
  DropdownMenu,
  DropdownMenuTrigger,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuLabel,
  DropdownMenuSeparator,
  DropdownMenuShortcut,
  DropdownMenuGroup,
} from 'novaui-components'
import { Button } from 'novaui-components'

export function BasicDropdownMenu() {
  return (
    <DropdownMenu>
      <DropdownMenuTrigger>
        <Button variant="outline" label="Open Menu" />
      </DropdownMenuTrigger>
      <DropdownMenuContent className="w-56">
        <DropdownMenuLabel>My Account</DropdownMenuLabel>
        <DropdownMenuSeparator />
        <DropdownMenuGroup>
          <DropdownMenuItem>
            Profile
            <DropdownMenuShortcut>⇧⌘P</DropdownMenuShortcut>
          </DropdownMenuItem>
          <DropdownMenuItem>
            Billing
            <DropdownMenuShortcut>⌘B</DropdownMenuShortcut>
          </DropdownMenuItem>
          <DropdownMenuItem>
            Settings
            <DropdownMenuShortcut>⌘S</DropdownMenuShortcut>
          </DropdownMenuItem>
        </DropdownMenuGroup>
        <DropdownMenuSeparator />
        <DropdownMenuItem>Log out</DropdownMenuItem>
      </DropdownMenuContent>
    </DropdownMenu>
  )
}

With Checkbox Items

Appearance
Status Bar
Activity Bar
Panel
import { useState } from 'react'

export function CheckboxDropdown() {
  const [statusBar, setStatusBar] = useState(true)
  const [activityBar, setActivityBar] = useState(true)
  const [panel, setPanel] = useState(false)

  return (
    <DropdownMenu>
      <DropdownMenuTrigger>
        <Button variant="outline" label="Appearance" />
      </DropdownMenuTrigger>
      <DropdownMenuContent className="w-56">
        <DropdownMenuLabel>Appearance</DropdownMenuLabel>
        <DropdownMenuSeparator />
        <DropdownMenuCheckboxItem
          checked={statusBar}
          onPress={() => setStatusBar(!statusBar)}
        >
          Status Bar
        </DropdownMenuCheckboxItem>
        <DropdownMenuCheckboxItem
          checked={activityBar}
          onPress={() => setActivityBar(!activityBar)}
        >
          Activity Bar
        </DropdownMenuCheckboxItem>
        <DropdownMenuCheckboxItem
          checked={panel}
          onPress={() => setPanel(!panel)}
        >
          Panel
        </DropdownMenuCheckboxItem>
      </DropdownMenuContent>
    </DropdownMenu>
  )
}

With Radio Items

Panel Position
Top
Bottom
Right
import { useState } from 'react'

export function RadioDropdown() {
  const [position, setPosition] = useState('top')

  return (
    <DropdownMenu>
      <DropdownMenuTrigger>
        <Button variant="outline" label="Position" />
      </DropdownMenuTrigger>
      <DropdownMenuContent className="w-56">
        <DropdownMenuLabel>Panel Position</DropdownMenuLabel>
        <DropdownMenuSeparator />
        <DropdownMenuRadioGroup>
          <DropdownMenuRadioItem
            checked={position === 'top'}
            onPress={() => setPosition('top')}
          >
            Top
          </DropdownMenuRadioItem>
          <DropdownMenuRadioItem
            checked={position === 'bottom'}
            onPress={() => setPosition('bottom')}
          >
            Bottom
          </DropdownMenuRadioItem>
          <DropdownMenuRadioItem
            checked={position === 'right'}
            onPress={() => setPosition('right')}
          >
            Right
          </DropdownMenuRadioItem>
        </DropdownMenuRadioGroup>
      </DropdownMenuContent>
    </DropdownMenu>
  )
}

With Sub-Menu

New File
More Tools
Quit
<DropdownMenu>
  <DropdownMenuTrigger>
    <Button variant="outline" label="File" />
  </DropdownMenuTrigger>
  <DropdownMenuContent className="w-56">
    <DropdownMenuItem>New File</DropdownMenuItem>
    <DropdownMenuSub>
      <DropdownMenuSubTrigger>More Tools</DropdownMenuSubTrigger>
      <DropdownMenuSubContent>
        <DropdownMenuItem>Save All</DropdownMenuItem>
        <DropdownMenuItem>Revert File</DropdownMenuItem>
      </DropdownMenuSubContent>
    </DropdownMenuSub>
    <DropdownMenuSeparator />
    <DropdownMenuItem>Quit</DropdownMenuItem>
  </DropdownMenuContent>
</DropdownMenu>

Props API

PropTypeDefaultDescription
childrenReact.ReactNode-Trigger and content children

Extends React.ComponentPropsWithoutRef<typeof Pressable>:

PropTypeDefaultDescription
asChildbooleanfalseRender as the child element instead of a Pressable

Extends React.ComponentPropsWithoutRef<typeof View>:

PropTypeDefaultDescription
sideOffsetnumber4Offset from the trigger element in pixels
align'start' | 'center' | 'end''start'Alignment relative to the trigger
classNamestring-Additional CSS classes

Extends React.ComponentPropsWithoutRef<typeof Pressable>:

PropTypeDefaultDescription
insetbooleanfalseAdds left padding for icon alignment
classNamestring-Additional CSS classes
PropTypeDefaultDescription
checkedbooleanfalseWhether the checkbox is checked
PropTypeDefaultDescription
checkedbooleanfalseWhether the radio item is selected
PropTypeDefaultDescription
insetbooleanfalseAdds left padding for alignment
classNamestring-Additional CSS classes
PropTypeDefaultDescription
insetbooleanfalseAdds left padding for alignment

Best Practices

  1. Group related items: Use DropdownMenuGroup and DropdownMenuSeparator to organize items logically
  2. Add keyboard shortcuts: Show shortcut hints with DropdownMenuShortcut to aid discoverability
  3. Use labels: Add DropdownMenuLabel to describe sections within the menu
  4. Keep menus focused: Limit the number of items per menu; use sub-menus for overflow
  5. Close on action: Items automatically close the menu on press
  • Context Menu - For right-click / long-press menus
  • Menubar - For app-level menu bars
  • Select - For single-value selection dropdowns

On this page