Get startedFoundationsComponentsPatternsRules

Button

버튼은 사용자가 액션을 실행하거나 선택하도록 도와요. 링크 버튼, 아이콘 버튼, 링크 아이콘 버튼 변형을 함께 제공해요.

설치

pnpm dlx shadcn@latest add https://rebar.conmarket-landing.workers.dev/r/steel/button.json

한 파일에서 Button, IconButton, LinkButton, LinkIconButton 을 모두 내보내요. 여러 버튼을 묶으려면 Button Group, 기본 액션과 메뉴를 붙이려면 Split Button 을 써요.

Examples

Appearance

목적에 맞는 appearance 를 고르세요. 화면에서 가장 중요한 액션 하나에만 primary 를 쓰고, 나머지는 default 나 subtle 로 낮춰요.

Appearance용도
default대부분의 액션. 화면의 핵심 액션이 아닌 버튼은 기본적으로 이걸 써요.
primary폼 제출처럼 화면의 핵심 액션. 한 영역에 하나만 둬요.
subtleprimary 옆의 보조 액션이나 툴바처럼 버튼이 많이 모이는 곳
warning큰 변경이나 데이터 손실이 생길 수 있어 주의가 필요한 액션
danger삭제처럼 되돌릴 수 없는 파괴적 액션의 최종 확인
discovery새 기능을 처음 써 보도록 이끄는 액션

States

isSelected 는 선택된 상태, isLoading 은 라벨 대신 스피너를 보여주는 로딩 상태, isDisabled 는 누를 수 없는 상태예요. 로딩·비활성 중에는 클릭과 키 입력이 막혀요. 가운데 "변경 사항 저장" 버튼을 눌러 로딩을 확인해 보세요.

Spacing

기본 높이는 32px 이에요. 정보 밀도가 높은 표·툴바에서는 spacing="compact"(24px) 를 써요.

Full width

shouldFitContainer 를 주면 부모 너비를 꽉 채워요. 좁은 패널이나 모바일 레이아웃에 써요.

Button with icon

iconBefore, iconAfter 로 라벨 앞뒤에 아이콘을 넣어요. 아이콘이 있으면 라벨과의 간격이 4px 에서 6px 로 넓어져요. 엘리먼트(<Plus />)와 컴포넌트(Plus) 둘 다 받아요. 아이콘은 16px 이고, ChevronDown 같은 Chevron 아이콘만 12px 로 작게 그려요.

Truncation

라벨이 컨테이너보다 길면 한 줄로 유지하고 말줄임표로 잘라요.

Icon button

아이콘만 있는 버튼은 IconButton 을 써요. label 은 화면에 보이지 않는 텍스트로 들어가 스크린 리더가 읽어요. 기본은 툴팁이 꺼져 있고, isTooltipDisabled={false} 로 두면 label 을 툴팁으로 보여줘요(마지막 설정 버튼에 마우스를 올려 보세요). shape="circle" 로 원형을 만들 수 있어요. appearance 는 default, primary, discovery, subtle 만 지원해요.

버튼처럼 보여야 하는 링크는 LinkButton 을 써요. 실제로 <a href> 로 렌더링돼 페이지 이동에 맞는 의미를 가져요. 비활성이면 href 를 지우고 role="link" 와 aria-disabled 로 접근 가능하게 막아요. target="_blank" 이면 스크린 리더에 "(새 창에서 열림)" 이 함께 읽혀요.

아이콘만 있는 링크는 LinkIconButton 을 써요. props 는 IconButton 과 같고 href 가 추가돼요.

Usage guidelines

버튼은 이벤트나 액션을 실행하고, 누르면 다음에 무슨 일이 일어나는지 알려줘요. 폼이나 모달 다이얼로그 같은 더 큰 흐름의 일부로 자주 쓰여요.

구성

  • 라벨: 액션을 설명하는 텍스트. 동사로 시작해요.
  • 버튼 영역: 누를 수 있는 영역 전체.
  • 아이콘(선택): 대부분의 버튼에는 필요 없어요. 의미가 분명하고 널리 알려진 아이콘일 때만 넣어요.

핵심 액션은 하나만

Do· primary 는 하나
한 페이지나 영역에 primary 버튼은 하나만 둬서 가장 중요한 액션을 드러내요.
Don't· primary 남발
여러 버튼을 모두 primary 로 만들면 서로 주의를 빼앗아 무엇이 중요한지 알기 어려워요.

액션은 버튼, 이동은 링크

  • 버튼은 지금 화면에서 동작해요. 폼 제출, 미디어 재생, 모달 닫기 같은 경우예요.
  • 링크는 새 페이지나 앵커로 이동하고 URL 을 바꿔요. 버튼처럼 보여야 하는 이동은 LinkButton 을 써요.
  • 보조 기술은 <button> 과 링크를 다르게 다뤄요. 하나를 다른 것 대신 쓰지 않아요.

크기와 정렬

  • 누르기 충분히 크되 화면을 압도하지 않게 해요. 공간이 좁으면 compact 를 써요.
  • primary 버튼은 버튼 그룹이 정렬된 쪽 끝에 둬요.
  • 모달 다이얼로그, 온보딩 같은 단계형 흐름, 내용이 적은 집중 작업은 오른쪽 정렬해요.
  • 한 페이지짜리 폼이나 내용이 많은 전체 화면 작업, 카드 안의 버튼은 왼쪽 정렬해요.
  • 로그인 폼처럼 특별한 화면만 가운데 정렬해요.

라벨 쓰기

  • 짧고 구체적으로 써요. "확인"보다 "이슈 만들기", "편집"보다 "페이지 편집"처럼 무엇에 대한 액션인지 밝혀요.
  • 문장 부호는 붙이지 않아요. 영문 라벨은 첫 글자만 대문자로 쓰는 문장형(sentence case)으로 써요.

아이콘 버튼

  • 공간이 좁고 아이콘이 액션과 분명하게 연결될 때만 써요. 5초 안에 알맞은 아이콘이 떠오르지 않으면 텍스트 버튼이 나아요.
  • 한 아이콘을 여러 의미로 쓰지 않아요. 기본은 선 아이콘, 채워진 아이콘은 이미 실행·선택된 상태를 보여줄 때만 써요.
  • 대부분 사각형으로 쓰고, 원형은 상단 내비게이션 같은 일부 위치에만 써요.

Accessibility

  • 비활성화는 가능한 피해요. 비활성 버튼은 이유를 알려주지 못하고, Tab 순서에서 빠지며 hover·포커스·클릭을 받지 못해요. 대신 버튼을 활성으로 두고 검증 메시지로 무엇이 필요한지 알려줘요.
  • 비활성 버튼에 툴팁을 달지 않아요. 툴팁은 모든 기기와 보조 기술에서 닿을 수 있는 게 아니고, 상호작용하지 않는 요소에 붙으면 안 돼요.
  • IconButton, LinkIconButton 은 label 이 필수예요. aria-label 대신 화면에 보이지 않는 텍스트로 들어가 번역 도구에서도 번역돼요.
  • 로딩 중에는 aria-disabled, aria-busy 가 붙고 라벨 뒤에 ", 로딩 중" 이 함께 읽혀요.
  • 키보드: Tab 으로 포커스, Enter·Space 로 실행해요. 포커스되면 2px 포커스 링(border.focused)이 보여요.

Props

Button

Prop

Type

IconButton

Prop

Type

LinkButton

Prop

Type

LinkIconButton

Prop

Type

On this page