Components · ActionsNot verified with Figma

Button group

A button group is a row of joined System buttons for choosing between two to four short options. The selected button has a black 12% fill.

Tokens, sizes, measurements, states and requirements. Values come from the live token package and from the specification skill: no Figma component is linked.

Design Tokens

Resolved from the live token package.

StatePartTokenValue

Sizes

BreakpointHeightPaddingLabel
Mobile and tablet32px0 10px14/14, 0.42px, uppercase, weight 600
Desktop (769px+)40px0 16px16/16, 0.48px, uppercase, weight 600

The tablet range (640 to 768px) uses the mobile values. The 1px frame is drawn inside each button (inset box-shadow) and shared between neighbours with margin-left: -1px. The group is inline-flex and never wider than its parent.


Measurements

Dimensions

The padding of one button, left and right. The numbers are read from the component.

Breakpoint
A button at 2× size. Change the Breakpoint to see the mobile values.
AttributeMobile and tabletDesktop (769px+)
Height32px40px
Padding left and right10px16px
Padding above and belowNone: the height is fixed and the content is centredNone
Frame1px, inside the box, shared with the neighbour (margin-left: -1px)The same
Focus ring2px line, 2px gap, outside the boxThe same

Spacing

The side padding as a spacing token.

PartValue
Padding, desktopspace-16
Padding, mobile10px: literal, no spacing token

States

Selected is a black 12% fill (aria-pressed="true"). Hover darkens the frame and, when not selected, adds the fill. Hover and focus are forced on this page; in your code they come from :hover and the keyboard focus rule.

Breakpoint
StateNot selectedSelected

Typography

PartTypeMobile and tabletDesktop (769px+)
Labellabel-md14/14, 0.42px16/16, 0.48px

Breuer Condensed, weight 600, uppercase through CSS, so write the label in sentence case in the HTML. No font features, as for the Small button.


Structure

Elements

ElementClassNotes
Groupbtn-grouprole="group" with aria-label or aria-labelledby. inline-flex, max-width: 100%.
Buttonbutton inside the groupA real <button type="button">. Selected is aria-pressed="true".

Width

The group is as wide as its buttons and never wider than its parent. It never wraps. Two to four options.


Motion

PropertyDurationEasing
Fill: opacity of ::beforeduration-fast-2 (100ms)ease-standard
Frame: box-shadowduration-fast-2ease-standard
Focus ring: outline-colorduration-fast-2ease-standard

The same dissolve as the Button. Under prefers-reduced-motion: reduce the transition is turned off.


Behavior

TopicRule
SelectionOne selected at a time, set by your script via aria-pressed. The CSS does not toggle it.
Markuprole="group" with aria-label or aria-labelledby; real <button type="button">.
TabEach button is focusable; 2px focus ring with a 2px gap on keyboard focus.
Not navigationA System button group toggles state. Page navigation uses links.
CountTwo to four options. More: a select. When the group is wider than its container, show a select with the same options and keep the two in sync; never shrink, wrap or scroll the group.

Accessibility Requirements

TopicRequirement
Markuprole="group" with an accessible name; real buttons with aria-pressed.
Focus2px ring border-focus with a 2px gap, on keyboard use (WCAG 2.4.7, 1.4.11). It is set with body.keyboard-nav.
StateThe selected button differs by its fill and by aria-pressed, not by color alone (WCAG 1.4.1).
DisabledNot focusable. Disabled tokens are exempt from contrast requirements.