Incular logoIncular
API ReferenceDesign Systems

Button

Push, primary, ghost, and icon buttons with variants and styles.

use incular::controls_prelude::*;

Platform-neutral styled push button (TypedBuilder, Clone) — the single retained primitive everything Material renders through.

ButtonEmphasis
ButtonConfigurable base with ButtonVariant
PrimaryButtonHigh-emphasis filled
GhostButtonFlat toolbar style
IconButtonCompact square icon (ghost + 4px padding + 28px)
VariantStyle
Default / StandardNeutral push button
PrimaryAccent fill
GhostTransparent flat
Danger / DestructiveError/confirm-destructive
use incular::prelude::*;
use incular::controls_prelude::{Button, PrimaryButton};

fn main() {
    let app = Application::new(|_cx| {
        Container::builder()
            .padding(EdgeInsets::all(24.0))
            .alignment(Alignment::CENTER)
            .child(
                Column::builder()
                    .main_axis_size(MainAxisSize::Min)
                    .spacing(8.0)
                    .children(Vec::<Widget>::from([
                        Button::new("Save")
                                .on_click(|| println!("saved")).into(),
                        PrimaryButton::new("Go")
                                .on_click(|| println!("go")).into(),
                    ]))
                    .build(),
            )
            .build()
            .into()
    })
    .expect("valid application");
    incular::run(app).expect("run application");
}

Methods

new(label), with_child(child), with_icon_label(icon, label), label(...) (replaces label, clears child/icon), child, content (alias), variant(ButtonVariant), style(ButtonStyle), enabled(bool), focusable_when_disabled(bool), loading(bool), on_click(impl Fn()), build(&ControlTheme).

Effective enablement is enabled && !loading.

Variants

use incular::prelude::*;
use incular::controls_prelude::{GhostButton, IconButton, PrimaryButton};

fn main() {
    let app = Application::new(|_cx| {
        Column::builder()
            .main_axis_size(MainAxisSize::Min)
            .spacing(8.0)
            .children(Vec::<Widget>::from([
                PrimaryButton::new("Save").on_click(|| {}).into(),
                GhostButton::new("Cancel").on_click(|| {}).into(),
                IconButton::new("X").on_click(|| {}).into(),
            ]))
            .build()
            .into()
    })
    .expect("valid application");
    incular::run(app).expect("run application");
}

ButtonVariant: Default (default) / Standard / Primary / Ghost / Danger / Destructive. PrimaryButton/GhostButton/IconButton share the same method set (minus icon support on primary/ghost).

ButtonStyle

Sparse config; variant defaults to Default, everything else Option. background, foreground, overlay_color, shadow_color, surface_tint_color, elevation (Primary/Danger default 1.0, else 0.0), side, shape, border_radius, padding, minimum_size (base 64x36), fixed_size, maximum_size, icon_color, icon_size, icon_alignment (Start default / End), tap_target_size (Padded default, enforces 48 px / ShrinkWrap), animation_duration (200 ms), enable_feedback, alignment (CENTER), splash_factory (Ripple default / Splash / Sparkle / NoSplash), background_builder, foreground_builder, height, text_style, plus background_states/foreground_states (StateColor) and property resolvers. style.merge(&other), copy_with alias. Resolution precedence: disabled → invalid → pressed → checked → focused → hovered → normal.

Related: Material Buttons, Theme.

On this page