본문으로 건너뛰기

Button

액션을 실행하는 컨트롤입니다. 폼 제출, 저장, 삭제처럼 사용자가 의도적으로 일으키는 동작에 씁니다.

tsx
import { Button } from 'neba';

<Button onClick={save}>저장</Button>;

Props

Prop타입기본값설명
variant공통'solid' | 'outline' | 'text''solid'표면의 무게. 채움 / 하이라인 / 없음
size공통'xs' | 'sm' | 'md' | 'lg' | 'xl''md'높이와 타입 스케일. xs 22px · sm 26px · md 32px · lg 40px · xl 48px
color공통'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info''primary'의미론적 색 역할. 임의 색상값은 받지 않습니다
density공통'default' | 'compact''default'여백만 바꿉니다. 높이와 글자 크기는 그대로
elevation공통0 | 1 | 2 | 30그림자 깊이. 0은 그림자 없음. 호버는 한 단계 올리고, 누르면 한 단계 내립니다
startIconReactNode라벨 앞에 놓이는 내용. 1.2em으로 그려져 라벨 크기를 따라갑니다
endIconReactNode라벨 뒤에 놓이는 내용
loadingbooleanfalsestartIcon 자리에 스피너를 띄우고 활성화를 막습니다. 포커스는 유지됩니다
readOnlybooleanfalse비활성이되 흐려지지 않음. 액션은 존재하지만 여기서는 쓸 수 없다는 뜻
disabledbooleanfalse사용 불가. 색 계열을 버리고 중립 회색이 되며, 포커스 순서에서 빠집니다
fullWidthbooleanfalse컨테이너 너비만큼 확장
renderuseRender.RenderPropbutton 대신 다른 요소로 렌더링합니다 (<a href>, 라우터의 Link). 링크는 링크로 남아 크롤러와 스크린리더가 그대로 인식합니다
childrenReactNode라벨. 생략하면 정사각형 아이콘 버튼이 됩니다

<button>의 native 속성은 그대로 전달됩니다. color만 위 표의 color와 이름이 겹쳐 제외됩니다.

공통 축(variant size color density elevation)의 의미는 Prop 규약에 있습니다.

예시

variant

solid는 주 액션, outline은 보조 액션, text는 목록이나 툴바에 놓이는 낮은 무게의 액션입니다. 한 화면에 solid는 하나만 두세요.

color

여섯 가지 역할 색만 받습니다. 임의의 색상값은 지정할 수 없습니다.

size

높이와 타입 스케일을 함께 정합니다. xs 22px · sm 26px · md 32px · lg 40px · xl 48px이며, 데스크톱 기본은 md입니다.

density

density는 좌우 padding만 바꿉니다. 같은 size라면 높이가 동일하므로 한 줄에 섞어 놓아도 기준선이 맞습니다.

startIcon과 endIcon

아이콘은 1.2em으로 그려져 라벨 크기를 따라갑니다. 크기를 따로 지정할 필요가 없습니다. children 없이 아이콘만 주면 정사각형 버튼이 되며, 이때는 aria-label이 필요합니다. 아이콘 전용 컨트롤이라면 IconButtonlabel을 필수로 요구합니다.

loading · readOnly · disabled

prop겉모습focusnative disabled
loading그대로. startIcon 자리에 spinner유지아니오
readOnly색은 유지, 평평해지고 채도가 빠짐유지아니오
disabled색 계열을 버리고 중립 회색빠짐

세 상태 모두 클릭이 부모로 전파되지 않습니다.

elevation

그림자 깊이입니다. 기본값 0은 그림자가 전혀 없다는 뜻입니다. hover하면 한 단계 올라가고 누르면 한 단계 내려가므로, 0인 버튼도 눌린 것이 표현됩니다.

fullWidth

컨테이너 너비만큼 확장합니다.

render

<button> 대신 다른 요소로 렌더링합니다. 누르면 이동하는 액션은 <a href>여야 합니다. 크롤러가 따라갈 수 있고, 스크린리더의 링크 목록에 올라가며, 새 탭으로 열기나 주소 복사 같은 브라우저의 기본 동작이 그대로 살아납니다. 라우터의 Link도 같은 방식으로 넘깁니다.

표면과 크기, press 신호는 그대로입니다. <a>에는 disabled가 없으므로, 사용할 수 없어야 하는 버튼은 <button>으로 두세요.

접근성

  • 기본적으로 native <button>으로 렌더링됩니다. type도 그대로 전달되므로 폼 안에서 type="submit"이 동작합니다.
  • render로 요소를 바꿔도 그 요소의 semantics는 유지됩니다. <a href>role="button"으로 덮이지 않고 링크로 남습니다.
  • 아이콘만 있는 버튼에는 aria-label을 주세요.
  • focus ring은 :focus-visible에서만 나타나므로 마우스 클릭에는 보이지 않습니다.
  • loadingreadOnly는 focus를 유지합니다. tab 순서에서 사라지면 키보드 사용자가 페이지 구조를 잃기 때문입니다.
  • 모든 색 조합이 채움 위 글자 대비 4.5:1을 만족합니다.

Released under the MIT License