ButtonGroup

A group of buttons visually connected together. Use regular Button components as children.

Examples

Basic Usage

Button groups can be oriented horizontally or vertically

Horizontal (Default)

Vertical

View Code
use leptos::prelude::*;
use mosaic_tiles::button::{Button, ButtonVariant};
use mosaic_tiles::button_group::*;

#[component]
pub fn BasicExample() -> impl IntoView {
    view! {
        <div class="space-y-4">
            <div class="flex gap-8">
                <div>
                    <p class="text-sm text-gray-600 mb-2">"Horizontal (Default)"</p>
                    <ButtonGroup>
                        <Button variant=ButtonVariant::Outline>"Left"</Button>
                        <Button variant=ButtonVariant::Outline>"Center"</Button>
                        <Button variant=ButtonVariant::Outline>"Right"</Button>
                    </ButtonGroup>
                </div>

                <div>
                    <p class="text-sm text-gray-600 mb-2">"Vertical"</p>
                    <ButtonGroup orientation=ButtonGroupOrientation::Vertical>
                        <Button variant=ButtonVariant::Outline>"Top"</Button>
                        <Button variant=ButtonVariant::Outline>"Middle"</Button>
                        <Button variant=ButtonVariant::Outline>"Bottom"</Button>
                    </ButtonGroup>
                </div>
            </div>
        </div>
    }
}

Size Variants

Button groups in small, medium, and large sizes

Small

Medium (Default)

Large

View Code
use leptos::prelude::*;
use mosaic_tiles::button::{Button, ButtonVariant};
use mosaic_tiles::button_group::*;

#[component]
pub fn SizesExample() -> impl IntoView {
    view! {
        <div class="space-y-4">
            <div>
                <p class="text-sm text-gray-600 mb-2">"Small"</p>
                <ButtonGroup size=ButtonGroupSize::Small>
                    <Button variant=ButtonVariant::Outline>"Small"</Button>
                    <Button variant=ButtonVariant::Outline>"Button"</Button>
                    <Button variant=ButtonVariant::Outline>"Group"</Button>
                </ButtonGroup>
            </div>

            <div>
                <p class="text-sm text-gray-600 mb-2">"Medium (Default)"</p>
                <ButtonGroup size=ButtonGroupSize::Medium>
                    <Button variant=ButtonVariant::Outline>"Medium"</Button>
                    <Button variant=ButtonVariant::Outline>"Button"</Button>
                    <Button variant=ButtonVariant::Outline>"Group"</Button>
                </ButtonGroup>
            </div>

            <div>
                <p class="text-sm text-gray-600 mb-2">"Large"</p>
                <ButtonGroup size=ButtonGroupSize::Large>
                    <Button variant=ButtonVariant::Outline>"Large"</Button>
                    <Button variant=ButtonVariant::Outline>"Button"</Button>
                    <Button variant=ButtonVariant::Outline>"Group"</Button>
                </ButtonGroup>
            </div>
        </div>
    }
}

Interactive Example

Interactive button group with click handlers

Count: 0

View Code
use leptos::prelude::*;
use mosaic_tiles::button::{Button, ButtonVariant};
use mosaic_tiles::button_group::*;

#[component]
pub fn InteractiveExample() -> impl IntoView {
    let (count, set_count) = signal(0);

    view! {
        <div class="space-y-4">
            <p class="text-sm text-gray-600">"Count: " {move || count.get()}</p>

            <ButtonGroup>
                <Button
                    variant=ButtonVariant::Outline
                    on:click=move |_| set_count.update(|n| *n -= 1)
                >
                    "-"
                </Button>
                <Button variant=ButtonVariant::Outline on:click=move |_| set_count.set(0)>
                    "Reset"
                </Button>
                <Button
                    variant=ButtonVariant::Outline
                    on:click=move |_| set_count.update(|n| *n += 1)
                >
                    "+"
                </Button>
            </ButtonGroup>
        </div>
    }
}

Disabled State

Button group with disabled items

View Code
use leptos::prelude::*;
use mosaic_tiles::button::{Button, ButtonVariant};
use mosaic_tiles::button_group::*;

#[component]
pub fn DisabledExample() -> impl IntoView {
    view! {
        <div class="space-y-4">
            <ButtonGroup>
                <Button variant=ButtonVariant::Outline>"Active"</Button>
                <Button variant=ButtonVariant::Outline disabled=true>
                    "Disabled"
                </Button>
                <Button variant=ButtonVariant::Outline>"Active"</Button>
            </ButtonGroup>
        </div>
    }
}

With Icons

Button groups containing icons

View Code
use leptos::prelude::*;
use mosaic_tiles::button::{Button, ButtonVariant};
use mosaic_tiles::button_group::*;
use mosaic_tiles::icon::*;

#[component]
pub fn WithIconsExample() -> impl IntoView {
    view! {
        <div class="space-y-4">
            <div>
                <ButtonGroup>
                    <Button variant=ButtonVariant::Outline>
                        <Icon icon=IconChevronLeft class="w-4 h-4" />
                    </Button>
                    <Button variant=ButtonVariant::Outline>
                        <Icon icon=IconChevronRight class="w-4 h-4" />
                    </Button>
                </ButtonGroup>

            </div>
            <div>
                <ButtonGroup>
                    <Button variant=ButtonVariant::Outline>
                        <Icon icon=IconChevronLeft class="w-4 h-4 inline mr-2" />
                        "Prev"
                    </Button>
                    <Button variant=ButtonVariant::Outline>
                        "Next" <Icon icon=IconChevronRight class="w-4 h-4 inline ml-2" />
                    </Button>
                </ButtonGroup>

            </div>
        </div>
    }
}

Anatomy

use leptos::prelude::*;
use mosaic_tiles::button::Button;
use mosaic_tiles::button_group::*;

#[component]
pub fn ButtonGroupAnatomy() -> impl IntoView {
    view! {
        <ButtonGroup>
            <Button>"Option 1"</Button>
            <Button>"Option 2"</Button>
            <Button>"Option 3"</Button>
        </ButtonGroup>
    }
}

API Reference

ButtonGroup

Container component that visually groups Button components together.

Automatically applies connected styling to Button children. Use regular Button components as children.

AttributeTypeDefaultDescription
sizeButtonGroupSizeMediumSize of the button group: Small, Medium, or Large
orientationButtonGroupOrientationHorizontalOrientation of the button group: Horizontal or Vertical
childrenOption<Children>NoneButton components to display in the group