Menu
BetaPopup menu with anchored placement and actionable items.
Installation
npm install @xaui/native
Import
import { Menu, MenuItem } from '@xaui/native/menu'
Basic Usage
Minimal example showing the component with its default configuration.
import { Menu } from '@xaui/native/menu'export function Example() {return <Menu />}
Basic Menu
Controlled open/close state with simple items.
import { useState } from 'react'import { Button } from '@xaui/native/button'import { Menu, MenuItem } from '@xaui/native/menu'export function BasicMenuExample() {const [visible, setVisible] = useState(false)return (<Menuvisible={visible}onDismiss={() => setVisible(false)}onItemPress={itemKey => {console.log('Pressed menu item:', itemKey)setVisible(false)}}trigger={<Button variant="bordered" onPress={() => setVisible(true)}>Open menu</Button>}><MenuItem itemKey="profile" title="Profile" /><MenuItem itemKey="settings" title="Settings" /><MenuItem itemKey="logout" title="Logout" /></Menu>)}
Position and Max Height
Open above trigger and constrain long menus.
import { useState } from 'react'import { Button } from '@xaui/native/button'import { Menu, MenuItem } from '@xaui/native/menu'const actions = Array.from({ length: 12 }, (_, i) => `Action ${i + 1}`)export function PositionedMenuExample() {const [visible, setVisible] = useState(false)return (<Menuvisible={visible}position="top"maxHeight={220}onDismiss={() => setVisible(false)}trigger={<Button onPress={() => setVisible(true)}>Open top menu</Button>}>{actions.map(action => (<MenuItem key={action} title={action} onPress={() => setVisible(false)} />))}</Menu>)}
Start/End Content and Disabled Item
Attach icons/shortcuts and disable unavailable actions.
import { useState } from 'react'import { Button } from '@xaui/native/button'import { Menu, MenuItem } from '@xaui/native/menu'import { Typography } from '@xaui/native/typography'export function RichMenuExample() {const [visible, setVisible] = useState(false)return (<Menuvisible={visible}onDismiss={() => setVisible(false)}trigger={<Button onPress={() => setVisible(true)}>More</Button>}><MenuItemtitle="New file"startContent={<Typography>📄</Typography>}endContent={<Typography>⌘N</Typography>}onPress={() => setVisible(false)}/><MenuItemtitle="Rename"startContent={<Typography>✏️</Typography>}onPress={() => setVisible(false)}/><MenuItemtitle="Delete"startContent={<Typography>🗑️</Typography>}isDisabled/></Menu>)}