Menu
The Menu component provides dropdown menus that can be triggered by buttons or other interactive elements. It's perfect for navigation menus, action lists, and contextual options.
When to use
- Navigation menus in headers or sidebars
- Action menus for operations (Edit, Delete, etc.)
- User account dropdowns
- Settings and preferences menus
- Context menus for right-click actions
Key features
- Click or hover trigger - Flexible activation modes
- Multiple positions - 8 positioning options
- Keyboard navigation - Full arrow key support
- Auto-close - Closes on outside click or escape
- Separators - Group related menu items
- Icons - Support for icons in menu items
- Accessible - ARIA attributes and focus management
Anatomy
A menu consists of:
- Trigger - Button or element that opens the menu
- Content - Dropdown container with menu items
- Items - Individual clickable options
- Separators - Visual dividers between groups
- Icons - Optional visual indicators
Basic Menu
Menu Positions
Menu with Icons
Disabled Items
Icon Button Menu
Navigation Menu Example
Hamburger Menu
Account Menu
Filter & Sort Menu
Menu with Submenu
Context Menu (Right-click)
Right-click anywhere in this area
Application Toolbar Menu
Installation
npm install @pm7/core
CSS Classes
Class | Description |
---|---|
Container Classes | |
.pm7-menu |
Menu container |
.pm7-menu-bar |
Application-style menu bar container |
Trigger Classes | |
.pm7-menu-trigger |
Button that opens the menu |
Content Classes | |
.pm7-menu-content |
Dropdown container |
.pm7-menu-content--open |
Open state of menu |
.pm7-menu-content--start |
Explicit left alignment |
.pm7-menu-content--end |
Right alignment |
.pm7-menu-content--center |
Center alignment |
.pm7-menu-content--top |
For vertical positioning |
.pm7-menu-item |
Clickable menu item |
.pm7-menu-item--checkbox |
Checkbox menu item |
.pm7-menu-item--radio |
Radio menu item |
.pm7-menu-item--switch |
Switch/toggle menu item |
.pm7-menu-item--has-submenu |
Item with submenu indicator |
.pm7-menu-item--destructive |
Destructive action (red text) |
.pm7-menu-item--disabled |
Disabled state |
.pm7-menu-item--clicking |
Click animation state |
Structure Classes | |
.pm7-menu-item-icon |
Icon within menu item |
.pm7-menu-item-check |
Checkmark icon for checkbox menu items |
.pm7-menu-switch |
Switch element in switch menu items |
.pm7-menu-icon |
Icon in trigger button |
.pm7-menu-shortcut |
Keyboard shortcut hint |
.pm7-menu-separator |
Horizontal divider |
.pm7-menu-label |
Small section label |
.pm7-menu-section-title |
Large section header |
.pm7-submenu |
Submenu container |
.pm7-menu-submenu-icon |
Submenu arrow indicator |
Data Attributes
Attribute | Description |
---|---|
data-pm7-menu |
Auto-initialize menu |
data-position |
For menu positioning |
data-state |
For open/closed state |
data-submenu-open |
For submenu state |
data-active |
For active/selected state |
data-pm7-menu-initialized |
For tracking initialization |
data-checked |
Set checkable item state |
data-name |
Group radio items |
data-value |
Custom value for menu item |
aria-expanded |
For accessibility |
aria-disabled |
For disabled items |
Basic Usage
<div class="pm7-menu" data-pm7-menu>
<button class="pm7-button pm7-menu-trigger">
Menu
</button>
<div class="pm7-menu-content">
<button class="pm7-menu-item">Item 1</button>
<button class="pm7-menu-item">Item 2</button>
<button class="pm7-menu-item">Item 3</button>
</div>
</div>
Application Menu Bar
For desktop application-style menus, use the pm7-menu-bar
container:
<div class="pm7-menu-bar">
<div class="pm7-menu" data-pm7-menu>
<button class="pm7-menu-trigger">File</button>
<div class="pm7-menu-content">...</div>
</div>
<div class="pm7-menu" data-pm7-menu>
<button class="pm7-menu-trigger">Edit</button>
<div class="pm7-menu-content">...</div>
</div>
</div>
Features of menu bars:
- When one menu is open, hovering over other menu triggers will automatically open them
- Provides a native desktop application experience
- Click or hover to open menus
Menu Features
The PM7 Menu component includes:
- Auto-initialization: Menus with
data-pm7-menu
are automatically initialized - Position adjustment: Automatically adjusts to stay within viewport
- Keyboard navigation: Full keyboard support with arrow keys, Home/End, and Escape
- Checkable items: Support for checkbox, radio, and switch menu items
- Menu bar behavior: Hover-to-open when another menu is already open
- Submenu support: Nested menus with keyboard navigation
- Focus management: Proper focus trap and restoration
JavaScript API
import { PM7Menu } from '@pm7/core';
// Manual initialization
const menuElement = document.querySelector('.pm7-menu');
const menu = new PM7Menu(menuElement);
// Open/close programmatically
menu.open();
menu.close();
menu.toggle();
// Adjust position manually
menu.adjustPosition();
// Listen for selection
menuElement.addEventListener('pm7-menu-select', (e) => {
console.log('Selected item:', e.detail.item);
console.log('Menu instance:', e.detail.menu);
});
React Usage
import { Menu } from '@pm7/react';
function MyComponent() {
const menuItems = [
{ id: '1', label: 'Edit', icon: <EditIcon /> },
{ id: '2', label: 'Duplicate', icon: <CopyIcon /> },
{ id: 'sep', type: 'separator' },
{ id: '3', label: 'Delete', icon: <TrashIcon />, variant: 'destructive' }
];
return (
<Menu
trigger={<Button variant="outline">Options</Button>}
items={menuItems}
align="end"
onSelect={(item) => handleMenuSelect(item)}
/>
);
}
Keyboard Navigation
- Tab - Move focus to menu trigger
- Enter or Space - Open menu when trigger focused
- β - Move to next item
- β - Move to previous item
- β - Open submenu (when applicable)
- β - Close submenu
- Home - Jump to first item
- End - Jump to last item
- Escape - Close menu
- Enter or Space - Select focused item
Accessibility
The Menu component includes comprehensive accessibility features:
- Full keyboard navigation with intuitive controls
- Focus management with trap and restoration
- ARIA attributes for screen reader support
- Skip disabled items in keyboard navigation
- Click outside to close
- Hover delay for better submenu UX
- RTL support for right-to-left languages
Copy this link that can be used as documentation for working with this component:
π€ AI-Optimized Documentation
This link contains complete Markdown documentation that is perfectly readable by AI assistants, developers, and other automated systems. Directly accessible on GitHub - including all essential PM7 Menu implementation guidance.
Perfect for ChatGPT, Claude, and other AI code assistants