Button Group

관련 버튼을 일관된 스타일로 묶는 컨테이너입니다.

examples/krds/button-group-demo.tsx
"use client"

import * as React from "react"

설치

pnpm dlx shadcn@latest add https://krdscn.gwlee.kr/r/button-group.json

사용법

import {
  ButtonGroup,
  ButtonGroupSeparator,
  ButtonGroupText,
} from "@/components/ui/button-group"
<ButtonGroup>
  <Button>Button 1</Button>
  <Button>Button 2</Button>
</ButtonGroup>

구성

다음 조합으로 ButtonGroup:

ButtonGroup
├── Button or Input
├── ButtonGroupSeparator
└── ButtonGroupText

접근성

  • The ButtonGroup component has the role attribute set to group.
  • Use Tab to navigate between the buttons in the group.
  • Use aria-label or aria-labelledby to label the button group.
<ButtonGroup aria-label="Button group">
  <Button>Button 1</Button>
  <Button>Button 2</Button>
</ButtonGroup>

ButtonGroup과 ToggleGroup 비교

  • 실행 액션 버튼을 한 덩어리로 묶을 때는 ButtonGroup을 사용합니다.
  • 상태를 켜고 끄는 토글 버튼 묶음에는 ToggleGroup을 사용합니다.

예제

Orientation

Set the orientation prop to change the button group layout.

examples/krds/button-group-orientation.tsx
import { MinusIcon, PlusIcon } from "lucide-react"

import { Button } from "@/components/ui/button"

Size

Control the size of buttons using the size prop on individual buttons.

examples/krds/button-group-size.tsx
import { PlusIcon } from "lucide-react"

import { Button } from "@/components/ui/button"

Nested

Nest <ButtonGroup> components to create button groups with spacing.

examples/krds/button-group-nested.tsx
import { AudioLinesIcon, PlusIcon } from "lucide-react"

import { Button } from "@/components/ui/button"

Separator

The ButtonGroupSeparator component visually divides buttons within a group.

Buttons with variant outline do not need a separator since they have a border. For other variants, a separator is recommended to improve the visual hierarchy.

examples/krds/button-group-separator.tsx
import { Button } from "@/components/ui/button"
import {
  ButtonGroup,

Split

Create a split button group by adding two buttons separated by a ButtonGroupSeparator.

examples/krds/button-group-split.tsx
import { PlusIcon as IconPlus } from "lucide-react"

import { Button } from "@/components/ui/button"

Input

Wrap an Input component with buttons.

examples/krds/button-group-input.tsx
import { SearchIcon } from "lucide-react"

import { Button } from "@/components/ui/button"

Input Group

Wrap an InputGroup component to create complex input layouts.

examples/krds/button-group-input-group.tsx
"use client"

import * as React from "react"

Create a split button group with a DropdownMenu component.

examples/krds/button-group-dropdown.tsx
"use client"

import {

Select

Pair with a Select component.

examples/krds/button-group-select.tsx
"use client"

import * as React from "react"

Popover

Use with a Popover component.

examples/krds/button-group-popover.tsx
import { BotIcon, ChevronDownIcon } from "lucide-react"

import { Button } from "@/components/ui/button"

RTL

RTL 지원을 활성화하려면 RTL 설정 가이드를 참고하세요.

examples/krds/button-group-rtl.tsx
"use client"

import * as React from "react"

API 참조

ButtonGroup

The ButtonGroup component is a container that groups related buttons together with consistent styling.

속성타입기본값
orientation"horizontal" | "vertical""horizontal"
<ButtonGroup>
  <Button>Button 1</Button>
  <Button>Button 2</Button>
</ButtonGroup>

Nest multiple button groups to create complex layouts with spacing. nested example for more details.

<ButtonGroup>
  <ButtonGroup />
  <ButtonGroup />
</ButtonGroup>

ButtonGroupSeparator

The ButtonGroupSeparator component visually divides buttons within a group.

속성타입기본값
orientation"horizontal" | "vertical""vertical"
<ButtonGroup>
  <Button>Button 1</Button>
  <ButtonGroupSeparator />
  <Button>Button 2</Button>
</ButtonGroup>

ButtonGroupText

Use this component to display text within a button group.

속성타입기본값
asChildbooleanfalse
<ButtonGroup>
  <ButtonGroupText>Text</ButtonGroupText>
  <Button>Button</Button>
</ButtonGroup>

asChild prop으로 라벨 같은 커스텀 컴포넌트를 텍스트 영역으로 렌더링할 수 있습니다.

import { ButtonGroupText } from "@/components/ui/button-group"
import { Label } from "@/components/ui/label"

export function ButtonGroupTextDemo() {
  return (
    <ButtonGroup>
      <ButtonGroupText asChild>
        <Label htmlFor="name">Text</Label>
      </ButtonGroupText>
      <Input placeholder="Type something here..." id="name" />
    </ButtonGroup>
  )
}