Skip to main content

Menu

Dropdown menu with trigger, floating positioning, and keyboard navigation.

Import​

import '@kittl/ui';
import { Menu, MenuTrigger, MenuItem } from '@kittl/ui-react';

Usage​

<kittl-menu placement="bottom-start">
<kittl-menu-trigger>
<kittl-button variant="secondary">Options</kittl-button>
</kittl-menu-trigger>
<kittl-menu-item>Edit</kittl-menu-item>
<kittl-menu-item>Duplicate</kittl-menu-item>
<kittl-menu-item destructive>Delete</kittl-menu-item>
</kittl-menu>
import { Button, Menu, MenuItem, MenuTrigger } from '@kittl/ui-react';

/** Basic Menu usage, rendered live on the docs site. */
export const MenuUsage = () => (
<Menu
placement="bottom-start"
onMenuOpen={() => console.log('opened')}
onMenuClose={() => console.log('closed')}
>
<MenuTrigger>
<Button variant="secondary">Options</Button>
</MenuTrigger>
<MenuItem onMenuItemSelect={() => console.log('edit')}>Edit</MenuItem>
<MenuItem onMenuItemSelect={() => console.log('duplicate')}>
Duplicate
</MenuItem>
<MenuItem destructive onMenuItemSelect={() => console.log('delete')}>
Delete
</MenuItem>
</Menu>
);
PropertyAttributeTypeDefaultDescription
placementplacementPlacement'bottom-start'Floating-ui placement
openopenbooleanfalseWhether the menu is open
offsetoffsetnumber4Offset from trigger in pixels
PropertyAttributeTypeDefaultDescription
destructivedestructivebooleanfalseDestructive/danger styling
disableddisabledboolean—Disable the item
SlotDescription
icon-startIcon before the label
(default)Label text
icon-endIcon after the label

Events​

EventSourceDetailDescription
menu-openMenu—Menu opened
menu-closeMenu—Menu closed
menu-item-selectMenuItem—Item selected

React props: onMenuOpen, onMenuClose, onMenuItemSelect

Accessibility​

  • Menu content has role="menu"
  • Items have role="menuitem"
  • Keyboard: ArrowUp/ArrowDown navigate items, Enter/Space select, Escape closes