ButtonGroup

ButtonGroup은 관련 버튼을 시각적으로 그룹화하는 컨테이너입니다. 툴바, 필터, 액션 그룹 등 여러 선택지를 하나의 유닛으로 묶을 때 사용합니다.

ButtonGroup에 variant, size를 지정하면 자식 Button, IconButton에 자동 상속됩니다. 개별 오버라이드도 가능합니다.

2
Variants
5
Sizes
2
Orientations
Pure
React

Playground

미리보기
outlineD
Variant
Size
Radius
Icon
Weight
Direction
Attached
Count
State
<ButtonGroup variant="outline">
  <Button>Copy</Button>
  <Button>Cut</Button>
  <Button>Paste</Button>
</ButtonGroup>

Variants

Outline
배경과 어우러지는 중립 스타일
툴바, 필터
Ghost
컴팩트 UI와 내비게이션에 적합한 배경 없는 스타일
네비, 툴바

Sizes

ButtonGroup은 Button 크기를 Context로 상속합니다. Button과 동일한 크기 규칙이 적용됩니다.

xs
높이28px
좌우 패딩10px
Gap4px
아이콘14px
폰트12px
sm
높이32px
좌우 패딩12px
Gap8px
아이콘14px
폰트13px
md
높이36px
좌우 패딩14px
Gap8px
아이콘16px
폰트14px
default
높이40px
좌우 패딩16px
Gap8px
아이콘16px
폰트14px
lg
높이48px
좌우 패딩24px
Gap8px
아이콘16px
폰트16px

터치 타겟: WCAG 2.5.8 기준 최소 24px 터치 영역이 필요합니다. 가장 작은 xs(28px)도 기준을 충족합니다.

Features

Variant Combinations

편집 액션
실행 취소 / 다시 실행
줌 컨트롤
// Edit Actions (outline) - Click to execute immediately
<ButtonGroup variant="outline" size="sm">
  <Button leftIcon={<Copy />}>Copy</Button>
  <Button leftIcon={<Scissors />}>Cut</Button>
  <Button leftIcon={<Clipboard />}>Paste</Button>
</ButtonGroup>

// Undo/Redo Actions (outline) - History operations
<ButtonGroup variant="outline" size="sm">
  <IconButton aria-label="Undo"><Undo /></IconButton>
  <IconButton aria-label="Redo"><Redo /></IconButton>
</ButtonGroup>

// Zoom Controls (outline) - Zoom in/out actions
<ButtonGroup variant="outline" size="sm">
  <IconButton aria-label="Zoom out"><ZoomOut /></IconButton>
  <IconButton aria-label="Reset"><RotateCcw /></IconButton>
  <IconButton aria-label="Zoom in"><ZoomIn /></IconButton>
</ButtonGroup>

Orientation

Horizontal (기본값)
버튼을 수평으로 배치합니다. 툴바나 액션 그룹에 적합합니다.
툴바, 네비
Vertical
버튼을 수직으로 배치합니다. 사이드바나 드롭다운 메뉴에 적합합니다.
사이드바, 메뉴

API

Props

variantundefined
"outline" | "ghost"

자식 Button의 variant (Context로 상속)

sizeundefined
"xs" | "sm" | "md" | "default" | "lg"

자식 Button의 크기 (Context로 상속)

radiusundefined
"none" | "sm" | "base" | "default" | "lg" | "xl" | "2xl" | "3xl" | "full"

자식 Button의 모서리 둥글기 (Context로 상속)

fontWeightundefined
"normal" | "semibold"

자식 Button의 폰트 두께 (Context로 상속)

disabledundefined
boolean

모든 버튼 비활성화 (Context로 상속)

orientation"horizontal"
"horizontal" | "vertical"

버튼 배치 방향

attachedtrue
boolean

버튼끼리 결합하여 표시할지 여부

Customization

모든 버튼은 디자인 시스템의 스페이싱 규칙에 따른 기본값을 사용합니다. 그룹의 className으로 일괄 커스터마이즈할 수 있습니다.

좌우 패딩 변경

className="[&>button]:px-10"

버튼 너비 균등화

className="inline-grid grid-flow-col auto-cols-fr"

Tip:기본값은 일관성을 유지하도록 설계되어 있습니다. 필요한 경우 커스터마이즈하세요.

Anatomy

1
2
Copy
3
Cut
Paste
Layouthorizontal · vertical
rolegroup
1
Root
그룹 컨테이너
2
Button Item
가장자리 둥글기 유지
3
Divider
버튼 간 구분선

Best Practices

권장

  • 관련된 액션만 그룹화
  • ButtonGroup에 variant/size 지정 (자식에 상속)
  • 3~5개 버튼을 기준으로
  • 아이콘 전용 그룹에는 aria-label 설정
<ButtonGroup variant="outline" size="sm"> <Button>A</Button> <Button>B</Button> </ButtonGroup>

지양

  • 서로 다른 크기의 버튼을 섞지 않기
  • 관련 없는 액션을 그룹화하지 않기
  • 6개 이상의 버튼을 채우지 않기
  • destructive 버튼을 다른 것과 섞지 않기

Accessibility

키보드 조작

Tab버튼 간 이동
Enter / Space버튼 실행

ARIA 속성

  • role="group" 자동 부여
  • 시맨틱 그루핑
  • aria-label 권장
  • 포커스 시각화 지원

ButtonGroup vs ToggleGroup

비슷한 외형이지만 용도와 동작이 다릅니다. 적절한 컴포넌트를 선택하세요.

용도

ButtonGroup: 액션 버튼 그룹화

ToggleGroup: 온/오프 상태 관리

상태 관리

ButtonGroup: 수동 (selected prop)

ToggleGroup: 자동 (Radix 관리)

선택 모드

ButtonGroup: 수동 제어만

ToggleGroup: single / multiple

value 관리

ButtonGroup: 없음

ToggleGroup: value / onValueChange

사용 사례

ButtonGroup: 툴바, 액션 그룹

ToggleGroup: 텍스트 정렬, 포맷

선택 기준: 선택 상태를 자동 관리하려면 ToggleGroup, 클릭 시 특정 액션(API 호출 등)을 실행한다면 ButtonGroup이 적합합니다.