NovaUI
Components

Context Menu

A menu triggered by long-press that displays contextual actions for an element.

The Context Menu component provides a floating menu anchored to the long-press position. It supports items, checkbox items, radio items, sub-menus, labels, separators, and keyboard shortcuts. Built with React Native's Modal and Pressable for native long-press interactions.

Preview

Back⌘[
Forward⌘]
Reload⌘R
Save As...⇧⌘S
Print⌘P

Installation

npx novaui-cli add context-menu

Import

import {
  ContextMenu,
  ContextMenuTrigger,
  ContextMenuContent,
  ContextMenuItem,
  ContextMenuCheckboxItem,
  ContextMenuRadioItem,
  ContextMenuLabel,
  ContextMenuSeparator,
  ContextMenuShortcut,
  ContextMenuGroup,
  ContextMenuPortal,
  ContextMenuSub,
  ContextMenuSubContent,
  ContextMenuSubTrigger,
  ContextMenuRadioGroup,
} from 'novaui-components'

Basic Usage

The Context Menu is triggered by a long-press gesture on the trigger area:

Back⌘[
Forward⌘]
Reload⌘R
Save As...⇧⌘S
Print⌘P
import {
  ContextMenu,
  ContextMenuTrigger,
  ContextMenuContent,
  ContextMenuItem,
  ContextMenuSeparator,
  ContextMenuShortcut,
} from 'novaui-components'
import { View, Text } from 'react-native'

export function BasicContextMenu() {
  return (
    <ContextMenu>
      <ContextMenuTrigger className="flex h-[150px] w-[300px] items-center justify-center rounded-md border border-dashed text-sm">
        <Text>Long press here</Text>
      </ContextMenuTrigger>
      <ContextMenuContent className="w-64">
        <ContextMenuItem>
          Back
          <ContextMenuShortcut>⌘[</ContextMenuShortcut>
        </ContextMenuItem>
        <ContextMenuItem>
          Forward
          <ContextMenuShortcut>⌘]</ContextMenuShortcut>
        </ContextMenuItem>
        <ContextMenuItem>
          Reload
          <ContextMenuShortcut>⌘R</ContextMenuShortcut>
        </ContextMenuItem>
        <ContextMenuSeparator />
        <ContextMenuItem>
          Save As...
          <ContextMenuShortcut>⇧⌘S</ContextMenuShortcut>
        </ContextMenuItem>
        <ContextMenuItem>
          Print
          <ContextMenuShortcut>⌘P</ContextMenuShortcut>
        </ContextMenuItem>
      </ContextMenuContent>
    </ContextMenu>
  )
}

With Checkbox Items

View Options
Show Bookmarks
Show URLs
import { useState } from 'react'

export function CheckboxContextMenu() {
  const [bookmarks, setBookmarks] = useState(true)
  const [urls, setUrls] = useState(false)

  return (
    <ContextMenu>
      <ContextMenuTrigger className="flex h-[150px] w-[300px] items-center justify-center rounded-md border border-dashed text-sm">
        <Text>Long press here</Text>
      </ContextMenuTrigger>
      <ContextMenuContent className="w-56">
        <ContextMenuLabel>View Options</ContextMenuLabel>
        <ContextMenuSeparator />
        <ContextMenuCheckboxItem
          checked={bookmarks}
          onPress={() => setBookmarks(!bookmarks)}
        >
          Show Bookmarks
        </ContextMenuCheckboxItem>
        <ContextMenuCheckboxItem
          checked={urls}
          onPress={() => setUrls(!urls)}
        >
          Show URLs
        </ContextMenuCheckboxItem>
      </ContextMenuContent>
    </ContextMenu>
  )
}

With Sub-Menu

Cut
Copy
Paste
Share
<ContextMenu>
  <ContextMenuTrigger className="flex h-[150px] w-[300px] items-center justify-center rounded-md border border-dashed text-sm">
    <Text>Long press here</Text>
  </ContextMenuTrigger>
  <ContextMenuContent className="w-56">
    <ContextMenuItem>Cut</ContextMenuItem>
    <ContextMenuItem>Copy</ContextMenuItem>
    <ContextMenuItem>Paste</ContextMenuItem>
    <ContextMenuSeparator />
    <ContextMenuSub>
      <ContextMenuSubTrigger>Share</ContextMenuSubTrigger>
      <ContextMenuSubContent>
        <ContextMenuItem>Email</ContextMenuItem>
        <ContextMenuItem>Messages</ContextMenuItem>
        <ContextMenuItem>AirDrop</ContextMenuItem>
      </ContextMenuSubContent>
    </ContextMenuSub>
  </ContextMenuContent>
</ContextMenu>

Props API

ContextMenu

PropTypeDefaultDescription
childrenReact.ReactNode-Trigger and content children

ContextMenuTrigger

PropTypeDefaultDescription
disabledbooleanfalseDisables the long-press trigger
classNamestring-Additional CSS classes

ContextMenuContent

PropTypeDefaultDescription
classNamestring-Additional CSS classes

ContextMenuItem

Extends React.ComponentPropsWithoutRef<typeof Pressable>:

PropTypeDefaultDescription
insetbooleanfalseAdds left padding for icon alignment
classNamestring-Additional CSS classes

ContextMenuCheckboxItem

PropTypeDefaultDescription
checkedbooleanfalseWhether the checkbox is checked

ContextMenuRadioItem

PropTypeDefaultDescription
checkedbooleanfalseWhether the radio item is selected

ContextMenuLabel

PropTypeDefaultDescription
insetbooleanfalseAdds left padding for alignment

ContextMenuSubTrigger

PropTypeDefaultDescription
insetbooleanfalseAdds left padding for alignment

Best Practices

  1. Use for secondary actions: Context menus should contain actions relevant to the pressed element
  2. Keep it discoverable: Provide visual hints (e.g., dashed borders) that elements have context menus
  3. Don't put primary actions here: Essential actions should be accessible without long-press
  4. Group related items: Use separators and labels to organize actions logically
  5. Close on action: Items automatically close the menu on press

On this page