Button Group
Group related buttons together into a single section
<sa-button-group>
<sa-button-group>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Icon">
<sa-icon name="arrow-left"/>
</sa-button>
</sa-button-group>
<sa-button-group>
<sa-button variant="ButtonVariant.Outline">Review</sa-button>
<sa-button variant="ButtonVariant.Outline">Book Again</sa-button>
</sa-button-group>
<sa-button-group>
<sa-button variant="ButtonVariant.Outline">
<sa-icon name="mail"/>
Email Hotel
</sa-button>
</sa-button-group>
</sa-button-group>Usage
Put the buttons directly inside an <sa-button-group>. The group joins their borders and radii into one control.
<sa-button-group>
<sa-button>...</sa-button>
<sa-button>...</sa-button>
</sa-button-group>Examples
Basic
Two outline buttons joined into a single segmented control.
<sa-button-group>
<sa-button variant="ButtonVariant.Outline">
Flights
</sa-button>
<sa-button variant="ButtonVariant.Outline">
Hotels
</sa-button>
</sa-button-group>Sizes
Control the size of the buttons using the size property of the individual buttons.
<sa-button-group>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Small">Small</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Small">Button</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Small">Group</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.IconSmall" aria-label="Add">
<sa-icon name="plus"/>
</sa-button>
</sa-button-group>
<sa-button-group>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Default">Default</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Default">Button</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Default">Group</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Icon" aria-label="Add">
<sa-icon name="plus"/>
</sa-button>
</sa-button-group>
<sa-button-group>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Large">Large</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Large">Button</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Large">Group</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.IconLarge" aria-label="Add">
<sa-icon name="plus"/>
</sa-button>
</sa-button-group>Separator
When using button variants without a border (such as Default or Secondary), you can add a separator to visually separate buttons.
<sa-button-group>
<sa-button variant="ButtonVariant.Default">Review</sa-button>
<sa-button-group-separator/>
<sa-button variant="ButtonVariant.Default">Book Again</sa-button>
</sa-button-group>
<sa-button-group>
<sa-button variant="ButtonVariant.Secondary">Review</sa-button>
<sa-button-group-separator/>
<sa-button variant="ButtonVariant.Secondary">Book Again</sa-button>
</sa-button-group>With input
An <sa-input> can sit inside the group, before or after a button, and takes on the same joined borders.
<div class="flex flex-col gap-4">
<sa-button-group>
<sa-button variant="ButtonVariant.Outline">Search</sa-button>
<sa-input placeholder="Search destinations..." />
</sa-button-group>
<sa-button-group>
<sa-input placeholder="Enter promo code" />
<sa-button variant="ButtonVariant.Outline">Apply</sa-button>
</sa-button-group>
</div>With text
Use <sa-button-group-text> for a non-interactive segment such as a label or unit. It can also wrap an <sa-label> for the adjacent input.
<div class="flex flex-col gap-4">
<sa-button-group>
<sa-button-group-text>Sort by</sa-button-group-text>
<sa-button variant="ButtonVariant.Outline">Departure</sa-button>
</sa-button-group>
<sa-button-group>
<sa-button-group-text>
<sa-label for="input-text">
Booking ref
</sa-label>
</sa-button-group-text>
<sa-input id="input-text" placeholder="e.g. VT-48213"/>
</sa-button-group>
</div>With select
An <sa-select> joins the group in the same way as an input, here as a currency prefix for the amount.
<sa-field>
<sa-label for="amount">Amount</sa-label>
<sa-button-group>
<sa-button-group>
<sa-select>
<option>$</option>
<option>€</option>
<option>£</option>
</sa-select>
<sa-input id="amount" placeholder="Enter deposit amount"/>
</sa-button-group>
<sa-button-group>
<sa-button variant="ButtonVariant.Outline">
<sa-icon name="arrow-right"/>
</sa-button>
</sa-button-group>
</sa-button-group>
</sa-field>With icons
Icon-only buttons in a group make a compact toolbar.
<sa-button-group>
<sa-button variant="ButtonVariant.Outline">
<sa-icon name="square-centerline-dashed-horizontal"/>
</sa-button>
<sa-button variant="ButtonVariant.Outline" aria-label="Flip vertical">
<sa-icon name="square-centerline-dashed-vertical"/>
</sa-button>
<sa-button variant="ButtonVariant.Outline" aria-label="Rotate">
<sa-icon name="rotate-cw"/>
</sa-button>
</sa-button-group>With input group
For a single input with an addon, use an Input Group on its own. The next example joins one to buttons.
<sa-input-group>
<sa-input-group-input placeholder="Type to search..."/>
<sa-input-group-addon
align="InputGroupAddOnVariantAlignment.InlineStart"
class="text-muted-foreground">
<sa-icon name="search"/>
</sa-input-group-addon>
</sa-input-group>With fields
Wrap the group in an <sa-field> with an <sa-label> to give it a label. Here an input group with unit addons is joined to stepper buttons.
<sa-field-group class="max-w-[300px]">
<sa-field>
<sa-label for="width">Width</sa-label>
<sa-button-group>
<sa-input-group>
<sa-input-group-input id="width"/>
<sa-input-group-addon class="text-muted-foreground">
W
</sa-input-group-addon>
<sa-input-group-addon
align="InputGroupAddOnVariantAlignment.InlineEnd"
class="text-muted-foreground"
>
px
</sa-input-group-addon>
</sa-input-group>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Icon">
<sa-icon name="minus"/>
</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Icon" aria-label="Increase">
<sa-icon name="plus"/>
</sa-button>
</sa-button-group>
</sa-field>
</sa-field-group>
With like
Combine a button with <sa-button-group-text> to show a count next to the action.
<sa-button-group>
<sa-button variant="ButtonVariant.Outline">
<sa-icon name="heart"/>
Like
</sa-button>
<sa-button-group-text>
1.2K
</sa-button-group-text>
</sa-button-group>With select and input
A select and an input can be joined without any button at all.
<sa-button-group>
<sa-select>
<option>Hours</option>
<option>Days</option>
<option>Weeks</option>
</sa-select>
<sa-input />
</sa-button-group>With popover
The trailing icon button opens a Popover via popovertarget, giving a split-button style dropdown.
<sa-button-group>
<sa-button variant="ButtonVariant.Outline">
<sa-icon name="bot"/>
Trip Assistant
</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Icon" popovertarget="--popover-offset" aria-label="More options">
<sa-icon name="chevron-down"/>
</sa-button>
</sa-button-group>
<sa-popover id="--popover-offset" position="PositionArea.BottomSpanLeft">
<sa-stack gap="StackGap.Small">
<sa-popover-header>
<sa-popover-title>Ask the trip assistant</sa-popover-title>
<sa-popover-description>
Describe what you need in plain language.
</sa-popover-description>
</sa-popover-header>
<sa-field>
<sa-field-label for="--button-group-popopver-task" class="sr-only">
Request
</sa-field-label>
<sa-textarea
id="--button-group-popopver-task"
placeholder="I need to..."
class="resize-none"/>
<sa-field-description>
The assistant will draft an itinerary for you to review.
</sa-field-description>
</sa-field>
</sa-stack>
</sa-popover>Nested
You can nest button groups to create multiple groupings.
<sa-button-group>
<sa-button-group>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Icon">
<sa-icon name="plus"/>
</sa-button>
</sa-button-group>
<sa-button-group>
<sa-input-group>
<sa-input-group-input placeholder="Send a message..."/>
<sa-input-group-addon align="InputGroupAddOnVariantAlignment.InlineEnd">
<sa-icon name="audio-lines"/>
</sa-input-group-addon>
</sa-input-group>
</sa-button-group>
</sa-button-group>Pagination
Small outline buttons in a group make a compact pager.
<sa-button-group>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Small">
<sa-icon name="arrow-left"/>
Previous
</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Small">
1
</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Small">
2
</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Small">
3
</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Small">
4
</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Small">
5
</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Small">
Next
<sa-icon name="arrow-right"/>
</sa-button>
</sa-button-group>Pagination split
Nest groups inside a group to split the pager into separately bordered segments.
<sa-button-group>
<sa-button-group>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Small">
1
</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Small">
2
</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Small">
3
</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Small">
4
</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Small">
5
</sa-button>
</sa-button-group>
<sa-button-group>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.IconExtraSmall">
<sa-icon name="arrow-left"/>
</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.IconExtraSmall" aria-label="Next">
<sa-icon name="arrow-right"/>
</sa-button>
</sa-button-group>
</sa-button-group>Vertical
Use the orientation property to switch to a vertical layout.
<sa-button-group orientation="ButtonGroupOrientation.Vertical" aria-label="Media controls" class="h-fit">
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Icon">
<sa-icon name="plus"/>
</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Icon" aria-label="Decrease">
<sa-icon name="minus"/>
</sa-button>
</sa-button-group>Vertical nested
Vertical groups can be nested too, giving a stacked toolbar with a gap between the sections.
<sa-button-group orientation="ButtonGroupOrientation.Vertical" aria-label="Design tools palette">
<sa-button-group orientation="ButtonGroupOrientation.Vertical">
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Icon">
<sa-icon name="search" />
</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Icon" aria-label="Copy">
<sa-icon name="copy" />
</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Icon" aria-label="Share">
<sa-icon name="share" />
</sa-button>
</sa-button-group>
<sa-button-group orientation="ButtonGroupOrientation.Vertical">
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Icon">
<sa-icon name="square-centerline-dashed-horizontal" />
</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Icon" aria-label="Flip vertical">
<sa-icon name="square-centerline-dashed-vertical" />
</sa-button>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Icon" aria-label="Rotate">
<sa-icon name="rotate-cw" />
</sa-button>
</sa-button-group>
<sa-button-group>
<sa-button variant="ButtonVariant.Outline" size="ButtonSize.Icon">
<sa-icon name="trash" />
</sa-button>
</sa-button-group>
</sa-button-group>Accessibility
<sa-button-group> renders a <div role="group">. Give it an aria-label that describes the set of actions, and give every icon-only button inside it an accessible name with aria-label or a <span class="sr-only">. The buttons themselves keep their native focus and keyboard behaviour.
API Reference
<sa-button-group>
The wrapper element that groups related buttons. Renders a <div role="group">.
Prop
Type
<sa-button-group-separator>
An optional divider placed between buttons in a group. Renders a separator and takes no attributes other than orientation.
Prop
Type
<sa-button-group-text>
Wraps inline text or labels within a button group. Renders a <div> and takes no additional attributes beyond the standard HTML attributes (such as class).