Button Group
A container that groups related buttons together with consistent styling and shared borders.
Examples
Default
A container that groups related buttons together with consistent styling.
<%= render "ui/button_group" do %>
<%= render "ui/button", variant: :outline do %>Archive<% end %>
<%= render "ui/button", variant: :outline do %>Report<% end %>
<% end %><%= render UI::ButtonGroup.new do %>
<%= render UI::Button.new(variant: :outline) { "Archive" } %>
<%= render UI::Button.new(variant: :outline) { "Report" } %>
<% end %><%= render UI::ButtonGroupComponent.new do %>
<%= render(UI::ButtonComponent.new(variant: :outline)) { "Archive" } %>
<%= render(UI::ButtonComponent.new(variant: :outline)) { "Report" } %>
<% end %>Orientation
Change the button group layout with the orientation prop.
<%= render "ui/button_group", orientation: :vertical, classes: "h-fit" do %>
<%= render "ui/button", variant: :outline, size: :icon do %>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"/><path d="M12 5v14"/></svg>
<% end %>
<%= render "ui/button", variant: :outline, size: :icon do %>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"/></svg>
<% end %>
<% end %><%= render UI::ButtonGroup.new(orientation: :vertical, classes: "h-fit") do %>
<%= render UI::Button.new(variant: :outline, size: :icon) do %>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"/><path d="M12 5v14"/></svg>
<% end %>
<%= render UI::Button.new(variant: :outline, size: :icon) do %>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"/></svg>
<% end %>
<% end %><%= render UI::ButtonGroupComponent.new(orientation: :vertical, classes: "h-fit") do %>
<%= render UI::ButtonComponent.new(variant: :outline, size: :icon) do %>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"/><path d="M12 5v14"/></svg>
<% end %>
<%= render UI::ButtonComponent.new(variant: :outline, size: :icon) do %>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"/></svg>
<% end %>
<% end %>Size
Control the size of buttons using the size prop on individual buttons.
<div class="flex flex-col items-start gap-4">
<%= render "ui/button_group" do %>
<%= render "ui/button", variant: :outline, size: :sm do %>Small<% end %>
<%= render "ui/button", variant: :outline, size: :sm do %>Button<% end %>
<%= render "ui/button", variant: :outline, size: :sm do %>Group<% end %>
<% end %>
<%= render "ui/button_group" do %>
<%= render "ui/button", variant: :outline do %>Default<% end %>
<%= render "ui/button", variant: :outline do %>Button<% end %>
<%= render "ui/button", variant: :outline do %>Group<% end %>
<% end %>
<%= render "ui/button_group" do %>
<%= render "ui/button", variant: :outline, size: :lg do %>Large<% end %>
<%= render "ui/button", variant: :outline, size: :lg do %>Button<% end %>
<%= render "ui/button", variant: :outline, size: :lg do %>Group<% end %>
<% end %>
</div><div class="flex flex-col items-start gap-4">
<%= render UI::ButtonGroup.new do %>
<%= render UI::Button.new(variant: :outline, size: :sm) { "Small" } %>
<%= render UI::Button.new(variant: :outline, size: :sm) { "Button" } %>
<%= render UI::Button.new(variant: :outline, size: :sm) { "Group" } %>
<% end %>
<%= render UI::ButtonGroup.new do %>
<%= render UI::Button.new(variant: :outline) { "Default" } %>
<%= render UI::Button.new(variant: :outline) { "Button" } %>
<%= render UI::Button.new(variant: :outline) { "Group" } %>
<% end %>
<%= render UI::ButtonGroup.new do %>
<%= render UI::Button.new(variant: :outline, size: :lg) { "Large" } %>
<%= render UI::Button.new(variant: :outline, size: :lg) { "Button" } %>
<%= render UI::Button.new(variant: :outline, size: :lg) { "Group" } %>
<% end %>
</div><div class="flex flex-col items-start gap-4">
<%= render UI::ButtonGroupComponent.new do %>
<%= render(UI::ButtonComponent.new(variant: :outline, size: :sm)) { "Small" } %>
<%= render(UI::ButtonComponent.new(variant: :outline, size: :sm)) { "Button" } %>
<%= render(UI::ButtonComponent.new(variant: :outline, size: :sm)) { "Group" } %>
<% end %>
<%= render UI::ButtonGroupComponent.new do %>
<%= render(UI::ButtonComponent.new(variant: :outline)) { "Default" } %>
<%= render(UI::ButtonComponent.new(variant: :outline)) { "Button" } %>
<%= render(UI::ButtonComponent.new(variant: :outline)) { "Group" } %>
<% end %>
<%= render UI::ButtonGroupComponent.new do %>
<%= render(UI::ButtonComponent.new(variant: :outline, size: :lg)) { "Large" } %>
<%= render(UI::ButtonComponent.new(variant: :outline, size: :lg)) { "Button" } %>
<%= render(UI::ButtonComponent.new(variant: :outline, size: :lg)) { "Group" } %>
<% end %>
</div>Nested
Nest button groups to create spacing between groups.
<%= render "ui/button_group" do %>
<%= render "ui/button_group" do %>
<%= render "ui/button", variant: :outline, size: :sm do %>1<% end %>
<%= render "ui/button", variant: :outline, size: :sm do %>2<% end %>
<%= render "ui/button", variant: :outline, size: :sm do %>3<% end %>
<%= render "ui/button", variant: :outline, size: :sm do %>4<% end %>
<%= render "ui/button", variant: :outline, size: :sm do %>5<% end %>
<% end %>
<%= render "ui/button_group" do %>
<%= render "ui/button", variant: :outline, size: :"icon-sm" do %>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m12 19-7-7 7-7"/><path d="M19 12H5"/></svg>
<% end %>
<%= render "ui/button", variant: :outline, size: :"icon-sm" do %>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></svg>
<% end %>
<% end %>
<% end %><%= render UI::ButtonGroup.new do %>
<%= render UI::ButtonGroup.new do %>
<%= render UI::Button.new(variant: :outline, size: :sm) { "1" } %>
<%= render UI::Button.new(variant: :outline, size: :sm) { "2" } %>
<%= render UI::Button.new(variant: :outline, size: :sm) { "3" } %>
<%= render UI::Button.new(variant: :outline, size: :sm) { "4" } %>
<%= render UI::Button.new(variant: :outline, size: :sm) { "5" } %>
<% end %>
<%= render UI::ButtonGroup.new do %>
<%= render UI::Button.new(variant: :outline, size: :"icon-sm") do %>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m12 19-7-7 7-7"/><path d="M19 12H5"/></svg>
<% end %>
<%= render UI::Button.new(variant: :outline, size: :"icon-sm") do %>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></svg>
<% end %>
<% end %>
<% end %><%= render UI::ButtonGroupComponent.new do %>
<%= render UI::ButtonGroupComponent.new do %>
<%= render(UI::ButtonComponent.new(variant: :outline, size: :sm)) { "1" } %>
<%= render(UI::ButtonComponent.new(variant: :outline, size: :sm)) { "2" } %>
<%= render(UI::ButtonComponent.new(variant: :outline, size: :sm)) { "3" } %>
<%= render(UI::ButtonComponent.new(variant: :outline, size: :sm)) { "4" } %>
<%= render(UI::ButtonComponent.new(variant: :outline, size: :sm)) { "5" } %>
<% end %>
<%= render UI::ButtonGroupComponent.new do %>
<%= render UI::ButtonComponent.new(variant: :outline, size: :"icon-sm") do %>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m12 19-7-7 7-7"/><path d="M19 12H5"/></svg>
<% end %>
<%= render UI::ButtonComponent.new(variant: :outline, size: :"icon-sm") do %>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></svg>
<% end %>
<% end %>
<% end %>With Separator
The separator visually divides buttons. Use for non-outline variants to improve visual hierarchy.
<%= render "ui/button_group" do %>
<%= render "ui/button", variant: :secondary, size: :sm do %>Copy<% end %>
<%= render "ui/button_group/separator" %>
<%= render "ui/button", variant: :secondary, size: :sm do %>Paste<% end %>
<% end %><%= render UI::ButtonGroup.new do %>
<%= render UI::Button.new(variant: :secondary, size: :sm) { "Copy" } %>
<%= render UI::ButtonGroupSeparator.new %>
<%= render UI::Button.new(variant: :secondary, size: :sm) { "Paste" } %>
<% end %><%= render UI::ButtonGroupComponent.new do %>
<%= render(UI::ButtonComponent.new(variant: :secondary, size: :sm)) { "Copy" } %>
<%= render UI::ButtonGroupSeparatorComponent.new %>
<%= render(UI::ButtonComponent.new(variant: :secondary, size: :sm)) { "Paste" } %>
<% end %>With Input
Wrap an input component with buttons.
<%= render "ui/button_group" do %>
<%= render "ui/input", type: "text", placeholder: "Search..." %>
<%= render "ui/button", variant: :outline do %>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/></svg>
<% end %>
<% end %><%= render UI::ButtonGroup.new do %>
<%= render UI::Input.new(type: "text", placeholder: "Search...") %>
<%= render UI::Button.new(variant: :outline) do %>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/></svg>
<% end %>
<% end %><%= render UI::ButtonGroupComponent.new do %>
<%= render UI::InputComponent.new(type: "text", placeholder: "Search...") %>
<%= render UI::ButtonComponent.new(variant: :outline) do %>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/></svg>
<% end %>
<% end %>With Text
Display text within a button group.
<%= render "ui/button_group" do %>
<%= render "ui/button_group/text" do %>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2v20M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"/></svg>
USD
<% end %>
<%= render "ui/button", variant: :outline do %>Button<% end %>
<% end %><%= render UI::ButtonGroup.new do %>
<%= render UI::ButtonGroupText.new do %>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2v20M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"/></svg>
USD
<% end %>
<%= render UI::Button.new(variant: :outline) { "Button" } %>
<% end %><%= render UI::ButtonGroupComponent.new do %>
<%= render UI::ButtonGroupTextComponent.new do %>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2v20M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"/></svg>
USD
<% end %>
<%= render(UI::ButtonComponent.new(variant: :outline)) { "Button" } %>
<% end %>Features
- Custom styling with Tailwind classes
- Horizontal and vertical orientations
- Automatic border radius handling for grouped elements
- ARIA group role for accessibility
API Reference
Button Group
A container that groups related buttons together with consistent styling.
Parameters
| Name | Type | Default | Description |
|---|---|---|---|
| orientation | Symbol | :horizontal | Orientation of the group (horizontal or vertical) |
Data Attributes
| Attribute | Values | Description |
|---|---|---|
| data-slot | Identifies this element as a button group | |
| data-orientation | The current orientation of the group |
Separator
A visual separator between buttons within the group.
Parameters
| Name | Type | Default | Description |
|---|---|---|---|
| orientation | Symbol | :horizontal | Orientation of the separator (horizontal or vertical) |
Data Attributes
| Attribute | Values | Description |
|---|---|---|
| data-slot | Identifies this element as a button group separator | |
| data-orientation | The current orientation of the separator |
Text
A styled text element for use within button groups.
Accessibility
Uses role="group" to semantically group related buttons together.