---
layout: layouts/page.njk
title: Button Group
description: A container that groups related buttons together with consistent styling.
toc:
- label: Usage
id: usage
- label: Accessibility
id: accessibility
- label: Button Group vs Toggle Group
id: button-group-vs-toggle-group
- label: Examples
id: examples
children:
- label: Orientation
id: example-orientation
- label: Size
id: example-size
- label: Nested
id: example-nested
- label: Separator
id: example-separator
- label: Split
id: example-split
- label: Input
id: example-input
- label: Input Group
id: example-input-group
- label: Dropdown Menu
id: example-dropdown-menu
- label: Select
id: example-select
- label: Popover
id: example-popover
- label: RTL
id: example-rtl
---
{% from "dropdown-menu.njk" import dropdown_menu %}
{% from "popover.njk" import popover %}
{% from "select.njk" import select %}
{% from "macros/code_preview.njk" import code_preview %}
{% from "macros/code_block.njk" import code_block %}
{% set code_default %}
{% lucide "arrow-left" %}
Archive
Report
{% endset %}
{{ code_preview("button-group-default", code_default | prettyHtml) }}
Wrap related buttons or inputs in a <div role="group" class="button-group"> element. Add aria-label or aria-labelledby when the group purpose is not already clear from nearby text.
Use data-orientation="vertical" to stack items vertically. Use <hr role="separator"> to visually divide non-outline buttons. Use button-group-text for static text inside a group.
{% set code_simple %}
Archive
Report
{% endset %}
{{ code_block(code_simple | prettyHtml, "html") }}
Use role="group" on the button-group container.
Use aria-label or aria-labelledby to label groups whose purpose is not obvious.
Keyboard navigation remains native: users tab through each button, input, select, dropdown trigger, or popover trigger.
Use Button Group for related actions, such as archive/report/snooze.
Use Toggle Group when each item controls selected/on state.
Use data-orientation="vertical" to stack buttons vertically.
{% set code_orientation %}
{% lucide "plus" %}
{% lucide "minus" %}
{% endset %}
{{ code_preview("button-group-orientation", code_orientation | prettyHtml) }}
{% set code_size %}
Small
Button
Group
{% lucide "plus" %}
Default
Button
Group
{% lucide "plus" %}
Large
Button
Group
{% lucide "plus" %}
{% endset %}
{{ code_preview("button-group-size", code_size | prettyHtml) }}
{% set code_nested %}
{% endset %}
{{ code_preview("button-group-nested", code_nested | prettyHtml) }}
Use <hr role="separator"> to visually divide buttons within a group.
{% set code_separator %}
Copy
Paste
{% endset %}
{{ code_preview("button-group-separator", code_separator | prettyHtml) }}
Use a separator to create a split action with a primary action and a secondary menu trigger.
{% set code_split %}
{% endset %}
{{ code_preview("button-group-split", code_split | prettyHtml) }}
{% set code_input %}
{% lucide "search" %}
{% endset %}
{{ code_preview("button-group-input", code_input | prettyHtml) }}
{% set code_input_group %}
{% endset %}
{{ code_preview("button-group-input-group", code_input_group | prettyHtml) }}
{% set code_dropdown_menu %}
{% endset %}
{{ code_preview("button-group-dropdown-menu", code_dropdown_menu | prettyHtml) }}
{% set code_select %}
{% lucide "arrow-right" %}
{% endset %}
{{ code_preview("button-group-select", code_select | prettyHtml) }}
{% set code_popover %}
{% endset %}
{{ code_preview("button-group-popover", code_popover | prettyHtml) }}
Button groups support right-to-left layouts through logical border and radius rules. Add dir="rtl" to the group or an ancestor. Directional icons should be flipped explicitly.
{% set code_rtl %}
أرشفة
تقرير
إرسال
{% lucide "arrow-right", { "class": "rtl:rotate-180" } %}
{% endset %}
{{ code_preview("button-group-rtl", code_rtl | prettyHtml) }}