Skip to main content

ButtonProps

Struct ButtonProps 

Source
pub struct ButtonProps {
Show 14 fields pub class: MaybeProp<String>, pub appearance: Signal<ButtonAppearance>, pub shape: Signal<ButtonShape>, pub size: Signal<ButtonSize>, pub button_type: MaybeProp<ButtonType>, pub block: Signal<bool>, pub icon: MaybeProp<Icon>, pub disabled: Signal<bool>, pub disabled_focusable: Signal<bool>, pub loading: Signal<bool>, pub aria_pressed: MaybeProp<String>, pub on_click: Option<Callback<MouseEvent>>, pub children: Option<Children>, pub comp_ref: ComponentRef<ButtonRef>,
}
Expand description

Props for the Button component.

Runs a single command when activated — form submits, dialog confirmations, toolbar actions, and inline commands.

Pick ButtonAppearance::Primary for the one main action on a surface. Wire async work with loading and on_click. For navigation, use Link instead.

§When to use

  • Submitting forms, confirming dialogs, or firing one-off commands - Toolbar and card actions where a single clear primary action is needed - Icon-only affordances when space is tight (pair with aria-label on a wrapper)

§Usage

  1. Pick an ButtonAppearancePrimary for the main action, Secondary for alternatives. 2. Wire on_click with Callback when the button should run logic (not submit a native form). 3. Set loading while async work runs; disable the control when input is invalid or work is in-flight. 4. For E2E hooks, wrap the button in a native element with data-testid (see project UI rules).

§Best Practices

§Do’s

  • Use appearance=ButtonAppearance::Primary for the main action on a surface * Show loading during async handlers so users see in-progress state * Disable while the form is invalid or a request is outstanding * Use icon for recognizable actions (save, search, add)

§Don’ts

  • Do not stack multiple primary buttons in one row * Do not use data-testid on the component itself — wrap with a native element * Do not use icon-only buttons without an accessible name on the wrapper

§Button family

Orbital ships several command controls. When Button is not the right fit:

  • Single command on clickButton (this component). Use Link for navigation. - Primary command plus related alternatesActionMenuButton (Save + Save as / Export). - Menu of options, no primary segmentMenuButton, or Menu for custom triggers. - Primary label plus supporting lineCompoundButton. - One action pinned to the viewportFloatingButton. - Primary float plus fan-out secondariesFloatingActionsMenu. - Merge adjacent buttons visuallyButtonGroup (layout only; style each child explicitly). - Toolbar on/off pressed stateToggleButton. Prefer Switch for immediate settings.

§Examples

§Primary button

Default call-to-action on a form or dialog footer.

view! {
    <div data-testid="button-preview">
        <Button appearance=ButtonAppearance::Primary>
            "Save"
        </Button>
    </div>
}

§Secondary outline

Secondary actions beside the primary—cancel, back, or low-commit choices. Outline styling keeps emphasis below Primary without blending into the surface.

view! {
    <div data-testid="button-secondary">
        <Button appearance=ButtonAppearance::Secondary>
            "Cancel"
        </Button>
    </div>
}

§Subtle and transparent

Low-emphasis actions that blend into the surface until hovered.

view! {
    <div data-testid="button-subtle">
        <Button appearance=ButtonAppearance::Subtle>"More"</Button>
        <Button appearance=ButtonAppearance::Transparent>"Dismiss"</Button>
    </div>
}

§With icon

Leading icon reinforces the action (save, add, search) while the text label keeps meaning clear for sighted users and screen readers.

view! {
    <div data-testid="button-icon">
        <Button appearance=ButtonAppearance::Primary icon=icondata::AiSaveOutlined>
            "Save"
        </Button>
    </div>
}

§Icon-only

Compact affordance when toolbar space is tight. Wrap with aria-label in app code—the button has no visible text for assistive technologies.

view! {
    <div data-testid="button-icon-only">
        <Button icon=icondata::AiSearchOutlined appearance=ButtonAppearance::Subtle />
    </div>
}

§Sizes

Small fits toolbars and dense rows; medium is the default; large suits prominent mobile CTAs or hero actions. Set each with size=ButtonSize::….

use crate::{Button, ButtonSize};
view! {
    <div data-testid="button-sizes">
        <Button size=ButtonSize::Small>"Small"</Button>
        <Button size=ButtonSize::Medium>"Medium"</Button>
        <Button size=ButtonSize::Large>"Large"</Button>
    </div>
}

§Block (full width)

Stretches to the full container width—common for mobile form footers, stacked dialog actions, and narrow layouts.

view! {
    <div data-testid="button-block">
        <Button block=true appearance=ButtonAppearance::Primary>
            "Continue"
        </Button>
    </div>
}

§Loading state

Spinner replaces the icon slot and blocks clicks while async work runs. Pair with disabled form controls to prevent double submission.

view! {
    <div data-testid="button-loading">
        <Button appearance=ButtonAppearance::Primary loading=true>
            "Saving…"
        </Button>
    </div>
}

§Click handler

use leptos::prelude::*;
view! {
    <Button
        appearance=ButtonAppearance::Primary
        on_click=|_| {}
    >
        "Run action"
    </Button>
}

§Shapes

Rounded is the default for labeled buttons. Circular and square fit icon-only controls in toolbars, floating actions, and compact settings grids.

use crate::{Button, ButtonShape};
view! {
    <div data-testid="button-shapes">
        <Button shape=ButtonShape::Rounded>"Rounded"</Button>
        <Button shape=ButtonShape::Circular icon=icondata::AiPlusOutlined />
        <Button shape=ButtonShape::Square icon=icondata::AiSettingOutlined />
    </div>
}

§Disabled

Unavailable actions stay visibly disabled and ignore clicks. disabled_focusable keeps the button in tab order for tooltips or custom disabled messaging.

view! {
    <div data-testid="button-disabled">
        <Button appearance=ButtonAppearance::Primary disabled=true>
            "Unavailable"
        </Button>
        <Button appearance=ButtonAppearance::Secondary disabled_focusable=true>
            "Focusable when disabled"
        </Button>
    </div>
}

§Theme: primary uses brand token

Wrap in OrbitalThemeProvider with a custom brand palette so primary buttons use the theme’s brand color token.

use leptos::prelude::*;
use orbital_theme::{BrandPalette, OrbitalThemeProvider, Theme, ThemeMode};

view! {
    <div data-testid="button-theme-brand">
        <OrbitalThemeProvider theme=RwSignal::new(Theme::with_brand(
            ThemeMode::Light,
            BrandPalette { primary: "#E3008C".to_string() },
        ))>
            <Button appearance=ButtonAppearance::Primary>"Brand action"</Button>
        </OrbitalThemeProvider>
    </div>
}

§Imperative handle

// Focus or programmatically click via ButtonRef after mount.
use crate::{Button, ButtonRef};
use orbital_base_components::ComponentRef;
let btn_ref = ComponentRef::<ButtonRef>::default();
view! {
    <Button comp_ref=btn_ref appearance=ButtonAppearance::Primary>"Focus me"</Button>
}

§Optional Props

Fields§

§class: MaybeProp<String>

Extra CSS class names merged onto the root <button> element.

§appearance: Signal<ButtonAppearance>

Visual emphasis: primary, secondary, subtle, or transparent.

§shape: Signal<ButtonShape>

Border shape: rounded (default), circular, or square.

§size: Signal<ButtonSize>

Control size.

§button_type: MaybeProp<ButtonType>

Native button type attribute (submit, reset, or button).

§block: Signal<bool>

When true, the button stretches to the full width of its container.

§icon: MaybeProp<Icon>

Leading icon from the icondata catalog; omit children for icon-only buttons.

§disabled: Signal<bool>

When true, the button does not respond to clicks or submit actions.

§disabled_focusable: Signal<bool>

When true, the button stays focusable while disabled (for tooltips or custom UX).

§loading: Signal<bool>

When true, shows a spinner and blocks click handling until cleared.

§aria_pressed: MaybeProp<String>

Optional aria-pressed for toggle buttons.

§on_click: Option<Callback<MouseEvent>>

Handler invoked on click when not disabled or loading.

§children: Option<Children>

Button label text; optional when icon alone is sufficient.

§comp_ref: ComponentRef<ButtonRef>

Imperative handle for focus and click on the underlying DOM button.

Implementations§

Source§

impl ButtonProps

Source

pub fn builder() -> ButtonPropsBuilder<((), (), (), (), (), (), (), (), (), (), (), (), (), ())>

Create a builder for building ButtonProps. On the builder, call .class(...)(optional), .appearance(...)(optional), .shape(...)(optional), .size(...)(optional), .button_type(...)(optional), .block(...)(optional), .icon(...)(optional), .disabled(...)(optional), .disabled_focusable(...)(optional), .loading(...)(optional), .aria_pressed(...)(optional), .on_click(...)(optional), .children(...)(optional), .comp_ref(...)(optional) to set the values of the fields. Finally, call .build() to create the instance of ButtonProps.

Trait Implementations§

Source§

impl Props for ButtonProps

Source§

type Builder = ButtonPropsBuilder

Source§

fn builder() -> Self::Builder

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<S, D, Swp, Dwp, T> AdaptInto<D, Swp, Dwp, T> for S
where T: Real + Zero + Arithmetics + Clone, Swp: WhitePoint<T>, Dwp: WhitePoint<T>, D: AdaptFrom<S, Swp, Dwp, T>,

Source§

fn adapt_into_using<M>(self, method: M) -> D
where M: TransformMatrix<T>,

Convert the source color to the destination color using the specified method.
Source§

fn adapt_into(self) -> D

Convert the source color to the destination color using the bradford method by default.
Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T, C> ArraysFrom<C> for T
where C: IntoArrays<T>,

Source§

fn arrays_from(colors: C) -> T

Cast a collection of colors into a collection of arrays.
Source§

impl<T, C> ArraysInto<C> for T
where C: FromArrays<T>,

Source§

fn arrays_into(self) -> C

Cast this collection of arrays into a collection of colors.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<WpParam, T, U> Cam16IntoUnclamped<WpParam, T> for U
where T: FromCam16Unclamped<WpParam, U>,

Source§

type Scalar = <T as FromCam16Unclamped<WpParam, U>>::Scalar

The number type that’s used in parameters when converting.
Source§

fn cam16_into_unclamped( self, parameters: BakedParameters<WpParam, <U as Cam16IntoUnclamped<WpParam, T>>::Scalar>, ) -> T

Converts self into C, using the provided parameters.
Source§

impl<T, C> ComponentsFrom<C> for T
where C: IntoComponents<T>,

Source§

fn components_from(colors: C) -> T

Cast a collection of colors into a collection of color components.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromAngle<T> for T

Source§

fn from_angle(angle: T) -> T

Performs a conversion from angle.
Source§

impl<E, T, Request, Encoding> FromReq<Patch<Encoding>, Request, E> for T
where Request: Req<E> + Send + 'static, Encoding: Decodes<T>, E: FromServerFnError,

Source§

async fn from_req(req: Request) -> Result<T, E>

Attempts to deserialize the arguments from a request.
Source§

impl<E, T, Request, Encoding> FromReq<Post<Encoding>, Request, E> for T
where Request: Req<E> + Send + 'static, Encoding: Decodes<T>, E: FromServerFnError,

Source§

async fn from_req(req: Request) -> Result<T, E>

Attempts to deserialize the arguments from a request.
Source§

impl<E, T, Request, Encoding> FromReq<Put<Encoding>, Request, E> for T
where Request: Req<E> + Send + 'static, Encoding: Decodes<T>, E: FromServerFnError,

Source§

async fn from_req(req: Request) -> Result<T, E>

Attempts to deserialize the arguments from a request.
Source§

impl<E, Encoding, Response, T> FromRes<Patch<Encoding>, Response, E> for T
where Response: ClientRes<E> + Send, Encoding: Decodes<T>, E: FromServerFnError,

Source§

async fn from_res(res: Response) -> Result<T, E>

Attempts to deserialize the outputs from a response.
Source§

impl<E, Encoding, Response, T> FromRes<Post<Encoding>, Response, E> for T
where Response: ClientRes<E> + Send, Encoding: Decodes<T>, E: FromServerFnError,

Source§

async fn from_res(res: Response) -> Result<T, E>

Attempts to deserialize the outputs from a response.
Source§

impl<E, Encoding, Response, T> FromRes<Put<Encoding>, Response, E> for T
where Response: ClientRes<E> + Send, Encoding: Decodes<T>, E: FromServerFnError,

Source§

async fn from_res(res: Response) -> Result<T, E>

Attempts to deserialize the outputs from a response.
Source§

impl<T, U> FromStimulus<U> for T
where U: IntoStimulus<T>,

Source§

fn from_stimulus(other: U) -> T

Converts other into Self, while performing the appropriate scaling, rounding and clamping.
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> IntoAngle<U> for T
where U: FromAngle<T>,

Source§

fn into_angle(self) -> U

Performs a conversion into T.
Source§

impl<WpParam, T, U> IntoCam16Unclamped<WpParam, T> for U
where T: Cam16FromUnclamped<WpParam, U>,

Source§

type Scalar = <T as Cam16FromUnclamped<WpParam, U>>::Scalar

The number type that’s used in parameters when converting.
Source§

fn into_cam16_unclamped( self, parameters: BakedParameters<WpParam, <U as IntoCam16Unclamped<WpParam, T>>::Scalar>, ) -> T

Converts self into C, using the provided parameters.
Source§

impl<T, U> IntoColor<U> for T
where U: FromColor<T>,

Source§

fn into_color(self) -> U

Convert into T with values clamped to the color defined bounds Read more
Source§

impl<T, U> IntoColorUnclamped<U> for T
where U: FromColorUnclamped<T>,

Source§

fn into_color_unclamped(self) -> U

Convert into T. The resulting color might be invalid in its color space Read more
Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<E, T, Encoding, Request> IntoReq<Patch<Encoding>, Request, E> for T
where Request: ClientReq<E>, Encoding: Encodes<T>, E: FromServerFnError,

Source§

fn into_req(self, path: &str, accepts: &str) -> Result<Request, E>

Attempts to serialize the arguments into an HTTP request.
Source§

impl<E, T, Encoding, Request> IntoReq<Post<Encoding>, Request, E> for T
where Request: ClientReq<E>, Encoding: Encodes<T>, E: FromServerFnError,

Source§

fn into_req(self, path: &str, accepts: &str) -> Result<Request, E>

Attempts to serialize the arguments into an HTTP request.
Source§

impl<E, T, Encoding, Request> IntoReq<Put<Encoding>, Request, E> for T
where Request: ClientReq<E>, Encoding: Encodes<T>, E: FromServerFnError,

Source§

fn into_req(self, path: &str, accepts: &str) -> Result<Request, E>

Attempts to serialize the arguments into an HTTP request.
Source§

impl<E, Response, Encoding, T> IntoRes<Patch<Encoding>, Response, E> for T
where Response: TryRes<E>, Encoding: Encodes<T>, E: FromServerFnError + Send, T: Send,

Source§

async fn into_res(self) -> Result<Response, E>

Attempts to serialize the output into an HTTP response.
Source§

impl<E, Response, Encoding, T> IntoRes<Post<Encoding>, Response, E> for T
where Response: TryRes<E>, Encoding: Encodes<T>, E: FromServerFnError + Send, T: Send,

Source§

async fn into_res(self) -> Result<Response, E>

Attempts to serialize the output into an HTTP response.
Source§

impl<E, Response, Encoding, T> IntoRes<Put<Encoding>, Response, E> for T
where Response: TryRes<E>, Encoding: Encodes<T>, E: FromServerFnError + Send, T: Send,

Source§

async fn into_res(self) -> Result<Response, E>

Attempts to serialize the output into an HTTP response.
Source§

impl<T> IntoStimulus<T> for T

Source§

fn into_stimulus(self) -> T

Converts self into T, while performing the appropriate scaling, rounding and clamping.
Source§

impl<T> SerializableKey for T

Source§

fn ser_key(&self) -> String

Serializes the key to a unique string. Read more
Source§

impl<T> StorageAccess<T> for T

Source§

fn as_borrowed(&self) -> &T

Borrows the value.
Source§

fn into_taken(self) -> T

Takes the value.
Source§

impl<T, C> TryComponentsInto<C> for T
where C: TryFromComponents<T>,

Source§

type Error = <C as TryFromComponents<T>>::Error

The error for when try_into_colors fails to cast.
Source§

fn try_components_into(self) -> Result<C, <T as TryComponentsInto<C>>::Error>

Try to cast this collection of color components into a collection of colors. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T, U> TryIntoColor<U> for T
where U: TryFromColor<T>,

Source§

fn try_into_color(self) -> Result<U, OutOfBounds<U>>

Convert into T, returning ok if the color is inside of its defined range, otherwise an OutOfBounds error is returned which contains the unclamped color. Read more
Source§

impl<C, U> UintsFrom<C> for U
where C: IntoUints<U>,

Source§

fn uints_from(colors: C) -> U

Cast a collection of colors into a collection of unsigned integers.
Source§

impl<C, U> UintsInto<C> for U
where C: FromUints<U>,

Source§

fn uints_into(self) -> C

Cast this collection of unsigned integers into a collection of colors.
Source§

impl<S, T> Upcast<T> for S
where T: UpcastFrom<S> + ?Sized, S: ?Sized,

Source§

fn upcast(&self) -> &T
where Self: ErasableGeneric, T: Sized + ErasableGeneric<Repr = Self::Repr>,

Perform a zero-cost type-safe upcast to a wider ref type within the Wasm bindgen generics type system. Read more
Source§

fn upcast_into(self) -> T
where Self: Sized + ErasableGeneric, T: Sized + ErasableGeneric<Repr = Self::Repr>,

Perform a zero-cost type-safe upcast to a wider type within the Wasm bindgen generics type system. Read more