Skip to content
Twentyfirst UIPro

Button Group

Foundations · ButtonGroup, Button, IconButton, Popover, Menu

View as Markdown

Attached buttons that act as one control: undo/redo, zoom, or a split button whose arrow opens a menu.

  • Children are regular Button, IconButton or a Popover trigger; the group only joins their corners.
  • label names the group for assistive tech; orientation="vertical" stacks them.

Props

ButtonGroup

PropTypeNotes
label?stringAccessible name of the group.
orientation?"horizontal" | "vertical"
children?ReactNode
className?stringExtra class on the root element.
style?CSSPropertiesInline style on the root element.

Button

PropTypeNotes
variant?"primary" | "secondary" | "soft" | "ghost" | "danger" | "danger-solid"
size?"md" | "sm"
icon?IconName
iconRight?IconName
disabled?boolean
type?"button" | "submit" | "reset"
onClick?(e: MouseEvent<HTMLButtonElement>) => void
children?ReactNode
asChild?booleanRender the single child element (a link, a router Link) with the button's look instead of a <button>.
id?string
name?stringForm field name and value, sent with the form when this button submits it.
value?string
form?stringThe id of the form this button belongs to, when it sits outside it.
title?string
tabIndex?number
autoFocus?boolean
aria-label?string
aria-labelledby?string
aria-describedby?string
aria-expanded?boolean | "true" | "false"For disclosure and menu triggers: whether what the button controls is open.
aria-controls?string
aria-haspopup?boolean | "true" | "false" | "menu" | "listbox" | "tree" | "grid" | "dialog"
aria-pressed?boolean | "true" | "false" | "mixed"For toggle buttons.
aria-current?boolean | "true" | "false" | "page" | "step" | "location" | "date" | "time"
className?stringExtra class on the root element.
style?CSSPropertiesInline style on the root element.

IconButton

PropTypeNotes
iconIconNameRequired
labelstringAccessible name and tooltip (`aria-label` and `title`); `aria-label` or `title` override them.
variant?"soft" | "solid" | "outline" | "ghost"
size?"sm" | "md" | "lg"
type?"button" | "submit" | "reset"
onClick?(e: MouseEvent<HTMLButtonElement>) => void
disabled?boolean
asChild?booleanRender the single child element (a link) with the button's look; the icon is placed inside it.
children?ReactNode
id?string
name?stringForm field name and value, sent with the form when this button submits it.
value?string
form?stringThe id of the form this button belongs to, when it sits outside it.
title?string
tabIndex?number
autoFocus?boolean
aria-label?string
aria-labelledby?string
aria-describedby?string
aria-expanded?boolean | "true" | "false"For disclosure and menu triggers: whether what the button controls is open.
aria-controls?string
aria-haspopup?boolean | "true" | "false" | "menu" | "listbox" | "tree" | "grid" | "dialog"
aria-pressed?boolean | "true" | "false" | "mixed"For toggle buttons.
aria-current?boolean | "true" | "false" | "page" | "step" | "location" | "date" | "time"
className?stringExtra class on the root element.
style?CSSPropertiesInline style on the root element.

Popover

PropTypeNotes
triggerReactNode | ((s: { open: boolean; toggle: () => void }) => ReactNode)Required
open?boolean
onOpenChange?(o: boolean) => void
align?"start" | "end"
side?"top" | "bottom"
width?number
flush?boolean
block?boolean
role?string
children?ReactNode | ((s: { close: () => void }) => ReactNode)
className?stringExtra class on the root element.
style?CSSPropertiesInline style on the root element.

Menu

PropTypeNotes
items(MenuItem | "-")[]Required
label?stringAccessible name of the menu.
autoFocus?booleanFocus the first item on mount (menus opened from a button or the keyboard).
onClose?() => voidCalled after an item runs, and on Escape, so the owner can close the menu.
className?stringExtra class on the root element.
style?CSSPropertiesInline style on the root element.