A flexible dropdown/menu component with proper state management, keyboard navigation, and accessibility features built-in.
The Dropdown component provides a composable way to create dropdown menus with built-in hover and click triggers, keyboard navigation, and ARIA attributes for accessibility.
import code.yousef.summon.components.navigation.Dropdown
import code.yousef.summon.components.navigation.DropdownItem
Dropdown(
trigger = { Text("Menu") }
) {
DropdownItem("Option 1", onClick = { })
DropdownItem("Option 2", onClick = { })
DropdownItem("Option 3", onClick = { })
}
@Composable
fun Dropdown(
trigger: @Composable FlowContent.() -> Unit,
modifier: Modifier = Modifier(),
triggerBehavior: DropdownTrigger = DropdownTrigger.HOVER,
alignment: DropdownAlignment = DropdownAlignment.LEFT,
closeOnItemClick: Boolean = true,
content: @Composable FlowContent.() -> Unit
)
@Composable
fun DropdownItem(
label: String,
onClick: (() -> Unit)? = null,
href: String? = null,
modifier: Modifier = Modifier(),
enabled: Boolean = true
)
<a> tag if provided)@Composable
fun DropdownDivider(
modifier: Modifier = Modifier()
)
A visual divider for separating groups of dropdown items.
Dropdown(
trigger = {
Button(
onClick = { },
label = "Actions"
)
}
) {
DropdownItem("Edit", onClick = { /* handle edit */ })
DropdownItem("Delete", onClick = { /* handle delete */ })
}
Dropdown(
trigger = { Text("Projects") }
) {
DropdownItem(
label = "Project A",
href = "/projects/a"
)
DropdownItem(
label = "Project B",
href = "/projects/b"
)
DropdownDivider()
DropdownItem(
label = "New Project",
href = "/projects/new"
)
}
Dropdown(
trigger = { Text("Click me") },
triggerBehavior = DropdownTrigger.CLICK
) {
DropdownItem("Option 1", onClick = { })
DropdownItem("Option 2", onClick = { })
}
Dropdown(
trigger = { Text("User Menu") },
alignment = DropdownAlignment.RIGHT
) {
DropdownItem("Profile", href = "/profile")
DropdownItem("Settings", href = "/settings")
DropdownDivider()
DropdownItem("Logout", onClick = { /* logout */ })
}
Dropdown(
trigger = { Text("Actions") }
) {
DropdownItem("Available Action", onClick = { })
DropdownItem("Disabled Action", enabled = false)
}
Controls how the dropdown opens:
HOVER: Open on hoverCLICK: Open on clickBOTH: Open on both hover and clickControls menu alignment relative to trigger:
LEFT: Align left edges (default)RIGHT: Align right edgesCENTER: Center menu under triggerThe Dropdown component automatically includes:
aria-haspopup="true" on the triggeraria-expanded to indicate menu staterole="menu" on the dropdown menurole="menuitem" on each dropdown itemaria-disabled for disabled itemsYou can style the dropdown and its items using modifiers:
Dropdown(
trigger = { Text("Styled Menu") },
modifier = Modifier()
.style("font-family", "Arial")
) {
DropdownItem(
label = "Styled Item",
modifier = Modifier()
.style("font-weight", "bold")
)
}
The default styles include: