본문으로 건너뛰기

SegmentedButton

두세 개의 선택지를 하나로 붙여 놓고 그중 하나를 고르는 컨트롤입니다. 선택지가 짧고 개수가 적을 때, 모든 선택지를 한눈에 보여 주면서 자리를 아낍니다.

tsx
import { Segment, SegmentedButton } from 'neba';

<SegmentedButton aria-label="기간" defaultValue="week">
  <Segment value="day">일</Segment>
  <Segment value="week">주</Segment>
  <Segment value="month">월</Segment>
</SegmentedButton>;

Props

SegmentedButton

Prop타입기본값설명
variant공통'solid' | 'outline' | 'text''outline'세그먼트가 놓이는 홈통의 무게. solid는 서리 낀 홈통에 채워진 타일, outline은 같은 홈통에 얇은 선과 밝아진 타일, text는 홈통 없이 선택된 것에만 표면
size공통'xs' | 'sm' | 'md' | 'lg' | 'xl''md'세그먼트의 높이와 타입 스케일. Button과 같은 사다리입니다
color공통'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info''primary'의미론적 색 역할. 임의 색상값은 받지 않습니다
density공통'default' | 'compact''default'여백만 바꿉니다. 높이와 글자 크기는 그대로
elevation공통0 | 1 | 2 | 30홈통의 그림자 깊이. 0이 기본입니다
valuestring | number | null선택된 세그먼트. controlled
defaultValuestring | number | nullnull처음 선택된 세그먼트
onValueChange(value: string | number | null) => void선택이 바뀔 때
disabledbooleanfalse전체를 한 번에 사용 불가로
readOnlybooleanfalse무엇이 선택되었는지는 보이되 바꿀 수는 없습니다
namestring폼 전송 시의 필드 이름
fullWidthbooleanfalse세그먼트들이 폭을 똑같이 나눠 갖습니다
childrenReactNodeSegment들

valueonValueChange로 controlled, defaultValue로 uncontrolled 컴포넌트가 됩니다. 세트에는 이름이 필요하므로 aria-label이나 aria-labelledby를 주세요.

Segment

Prop타입기본값설명
value * string | number세그먼트의 식별자. onValueChange가 보고하는 값입니다
startIconReactNode라벨 앞의 내용
endIconReactNode라벨 뒤의 내용, 개수, 상태 점
disabledbooleanfalse사용 불가. 집합에는 남습니다
childrenReactNode세그먼트의 라벨

예시

variant

solid는 홈통 안에서 채워진 타일이 움직이고, outline은 같은 홈통에 테두리를 두르고 선택된 sheet를 밝힙니다. text는 홈통 없이 선택된 항목에만 표면이 생깁니다.

size

Button과 같은 컨트롤 높이 단계를 씁니다. md Segment와 md Button이 모두 32px이므로 툴바에 나란히 놓아도 기준선이 맞습니다.

startIcon · disabled · readOnly

readOnly는 선택 상태를 보여 주되 바꿀 수 없게 하고 채도만 낮춥니다. disabled는 색 계열을 중립 회색으로 바꿉니다. Segment 단위로도 disabled를 줄 수 있습니다.

fullWidth

세트를 컨테이너 너비만큼 늘리고 각 Segment가 공간을 균등하게 나눠 갖습니다.

접근성

  • role="radiogroup"으로 렌더링됩니다. 세트 전체가 tab 정지 하나이고, 그 안에서는 방향키로 이동하며, 선택된 항목에 aria-checked가 붙습니다.
  • 선택 타일은 left · top · width · height로 이동하므로 라벨이 다시 그려지지 않습니다. 첫 렌더와 창 크기 변경 시에는 애니메이션하지 않습니다.

이럴 때는 다른 컴포넌트를

  • 선택이 아니라 액션의 줄이라면 ButtonGroup을 쓰세요.
  • 선택지가 다섯 개를 넘거나 라벨이 길다면 Select를 쓰세요.
  • 아래에 패널이 딸린다면 Tabs를 쓰세요.
  • 눈에 보이는 라벨이 필요하다면 RadioGroup이 적합합니다.

Released under the MIT License