Menu
Menus display a list of choices on a temporary surface.
Overview
VetraMenu provides a modern dropdown menu system with:
- Smooth animations
- Elegant styling
- Support for icons and dividers
- Accessible by default
- Lightweight and natural feel
var expanded by remember { mutableStateOf(false) }
VetraDropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false }
) {
VetraMenuItem(
text = "Settings",
icon = Icons.Default.Settings,
onClick = { }
)
VetraMenuDivider()
VetraMenuItem(
text = "Logout",
icon = Icons.Default.Logout,
onClick = { }
)
}
Basic Usage
Common Patterns
Context Menu
var expanded by remember { mutableStateOf(false) }
Box {
VetraIconButton(
onClick = { expanded = true },
imageVector = Icons.Default.MoreVert,
contentDescription = "More options"
)
VetraDropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false }
) {
VetraMenuItem(
text = "Edit",
icon = Icons.Default.Edit,
onClick = {
editItem()
expanded = false
}
)
VetraMenuItem(
text = "Share",
icon = Icons.Default.Share,
onClick = {
shareItem()
expanded = false
}
)
VetraMenuDivider()
VetraMenuItem(
text = "Delete",
icon = Icons.Default.Delete,
onClick = {
deleteItem()
expanded = false
}
)
}
}
User Menu
VetraDropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false }
) {
VetraMenuItem(
text = "Profile",
icon = Icons.Default.Person,
onClick = { navigateToProfile() }
)
VetraMenuItem(
text = "Settings",
icon = Icons.Default.Settings,
onClick = { navigateToSettings() }
)
VetraMenuDivider()
VetraMenuItem(
text = "Logout",
icon = Icons.Default.Logout,
onClick = { logout() }
)
}
Best Practices
Do
- ✅ Use menus for secondary actions
- ✅ Group related items together
- ✅ Use dividers to separate groups
- ✅ Provide icons for clarity
- ✅ Keep menu items concise
Don't
- ❌ Use menus for primary actions (use buttons)
- ❌ Overcrowd menus with too many items
- ❌ Use menus for navigation (use navigation bars)
- ❌ Hide critical actions in menus
Accessibility
- Keyboard Navigation: Full keyboard support
- Screen Readers: Proper semantic roles
- Focus Management: Proper focus handling
- Dismissal: Multiple dismissal methods
API Reference
VetraDropdownMenu
| Parameter | Type | Default | Description |
|---|---|---|---|
expanded |
Boolean |
Required | Whether menu is visible |
onDismissRequest |
() -> Unit |
Required | Called when menu should dismiss |
modifier |
Modifier |
Modifier |
Modifier for customization |
offset |
IntOffset |
IntOffset(0, 0) |
Offset from anchor |
content |
@Composable ColumnScope.() -> Unit |
Required | Menu items |
VetraMenuItem
| Parameter | Type | Default | Description |
|---|---|---|---|
text |
String |
Required | Menu item text |
onClick |
() -> Unit |
Required | Callback when item is clicked |
modifier |
Modifier |
Modifier |
Modifier for customization |
enabled |
Boolean |
true |
Whether item is enabled |
icon |
ImageVector? |
null |
Optional leading icon |
VetraMenuDivider
Divider for separating menu items. No parameters.
Default Dimensions
| Property | Value | Note |
|---|---|---|
| Min Width | 180dp | Minimum menu width |
| Max Width | 280dp | Maximum menu width |
| Item Height | 48dp | Menu item height |
| Item Padding | 16dp | Internal padding |
| Icon Size | 20dp | Icon size |
| Animation Duration | 250ms | Transition animation |
See Also:
- Icon Button - For menu triggers
- Buttons - For primary actions