Skip to content

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);
    })
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

MethodDescription
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

MethodDescription
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

MethodDescription
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
MethodDescription
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