Are you an LLM? You can read better optimized documentation at /gpui-component/docs/components/button.md for this page in Markdown format
Button
A versatile button component with multiple variants, sizes, and states. Supports icons, loading states, and can be grouped together.
Import
rust
use gpui_component::button::{Button, ButtonGroup, DropdownButton};
Usage
Basic Button
rust
Button::new("my-button")
.label("Click me")
.on_click(|_, _, _| {
println!("Button clicked!");
})
Button Variants
rust
// Primary button
Button::new("btn-primary").primary().label("Primary")
// Secondary button (default)
Button::new("btn-secondary").label("Secondary")
// Danger button
Button::new("btn-danger").danger().label("Delete")
// Warning button
Button::new("btn-warning").warning().label("Warning")
// Success button
Button::new("btn-success").success().label("Success")
// Info button
Button::new("btn-info").info().label("Info")
// Ghost button
Button::new("btn-ghost").ghost().label("Ghost")
// Link button
Button::new("btn-link").link().label("Link")
// Text button
Button::new("btn-text").text().label("Text")
Outline Buttons
rust
Button::new("btn").primary().outline().label("Primary Outline")
Button::new("btn").danger().outline().label("Danger Outline")
Button Sizes
rust
Button::new("btn").xsmall().label("Extra Small")
Button::new("btn").small().label("Small")
Button::new("btn").label("Medium") // default
Button::new("btn").large().label("Large")
With Icons
rust
use gpui_component::{Icon, IconName};
// Icon before label
Button::new("btn")
.icon(IconName::Check)
.label("Confirm")
// Icon only
Button::new("btn")
.icon(IconName::Search)
// Custom icon size
Button::new("btn")
.icon(Icon::new(IconName::Heart))
.label("Like")
Button States
rust
// Disabled
Button::new("btn")
.label("Disabled")
.disabled(true)
// Loading
Button::new("btn")
.label("Loading")
.loading(true)
// Selected
Button::new("btn")
.label("Selected")
.selected(true)
// Compact (reduced padding)
Button::new("btn")
.label("Compact")
.compact()
Button Group
rust
ButtonGroup::new("btn-group")
.child(Button::new("btn1").label("One"))
.child(Button::new("btn2").label("Two"))
.child(Button::new("btn3").label("Three"))
Toggle Button Group
rust
ButtonGroup::new("toggle-group")
.multiple(true) // Allow multiple selections
.child(Button::new("btn1").label("Option 1").selected(true))
.child(Button::new("btn2").label("Option 2"))
.child(Button::new("btn3").label("Option 3"))
.on_click(|selected_indices, _, _| {
println!("Selected: {:?}", selected_indices);
})
Dropdown Button
rust
use gpui::Corner;
DropdownButton::new("dropdown")
.button(Button::new("btn").label("Click Me"))
.popup_menu(|menu, _, _| {
menu.menu("Option 1", Box::new(MyAction))
.menu("Option 2", Box::new(MyAction))
.separator()
.menu("Option 3", Box::new(MyAction))
})
// With custom anchor
DropdownButton::new("dropdown")
.button(Button::new("btn").label("Click Me"))
.popup_menu_with_anchor(Corner::BottomRight, |menu, _, _| {
menu.menu("Option 1", Box::new(MyAction))
})
Custom Variant
rust
use gpui_component::button::ButtonCustomVariant;
let custom = ButtonCustomVariant::new(cx)
.color(cx.theme().magenta)
.foreground(cx.theme().primary_foreground)
.border(cx.theme().magenta)
.hover(cx.theme().magenta.opacity(0.1))
.active(cx.theme().magenta);
Button::new("custom-btn")
.custom(custom)
.label("Custom Button")
API Reference
Button
Method | Description |
---|---|
new(id) | Create a new button with the given ID |
label(str) | Set button label text |
icon(icon) | Add icon to button (before label) |
loading_icon(icon) | Custom loading icon |
child(el) | Add custom child element |
on_click(fn) | Click event handler |
on_hover(fn) | Hover event handler |
disabled(bool) | Set disabled state |
loading(bool) | Set loading state |
selected(bool) | Set selected state |
compact() | Reduce padding |
Button Variants
Method | Description |
---|---|
primary() | Primary button style |
danger() | Danger button style |
warning() | Warning button style |
success() | Success button style |
info() | Info button style |
ghost() | Ghost button style |
link() | Link button style |
text() | Text button style |
outline() | Outline style (combines with variants) |
custom(variant) | Custom variant |
ButtonGroup
Method | Description |
---|---|
new(id) | Create a new button group |
child(button) | Add button to group |
multiple(bool) | Allow multiple selections |
compact() | Compact spacing |
outline() | Apply outline style to all buttons |
disabled(bool) | Disable all buttons |
on_click(fn) | Called with selected indices |
DropdownButton
Method | Description |
---|---|
new(id) | Create a new dropdown button |
button(btn) | Set the trigger button |
popup_menu(fn) | Set popup menu builder |
popup_menu_with_anchor(corner, fn) | Set menu with anchor position |
Examples
With Tooltip
rust
Button::new("btn")
.label("Hover me")
.tooltip("This is a helpful tooltip")
Custom Children
rust
Button::new("btn")
.child(
h_flex()
.items_center()
.gap_2()
.child("Custom Content")
.child(IconName::ChevronDown)
.child(IconName::Eye)
)
Accessibility
- Keyboard navigation with Tab
- Activate with Enter or Space
- Disabled buttons cannot be focused
- Loading state announced to screen readers