Segmented Control
여러 옵션 중 하나를 선택해 관련 콘텐츠를 즉시 필터링하거나 전환할 때 쓰는 컴포넌트예요.
설치
pnpm dlx shadcn@latest add https://rebar.conmarket-landing.workers.dev/r/segmented-control.jsonradix-ui 를 설치하고 아래 코드를 components/ui/segmented-control.tsx 에 복사해요.
Anatomy
Segmented Control은 전체를 감싸는 Container 안에 여러 개의 Segment가 자리 잡고 있고, 각 Segment는 텍스트 Label을 포함해요. 선택된 Segment 뒤에는 Indicator가 깔리고, 선택이 바뀌면 Indicator가 부드럽게 미끄러지듯 이동해요.
새로운 Segment가 생기거나 해당 Segment에 새로운 내용이 추가된 경우 Notification Badge를 선택적으로 표시할 수 있어요.
| 요소 | data-slot | 설명 |
|---|---|---|
| Container | segmented-control | Segment를 감싸는 둥근 배경이에요. |
| Segment | segmented-control-item | 하나의 선택지예요. 키보드 방향키로 이동하며 선택해요. |
| Indicator | segmented-control-indicator | 선택된 Segment 뒤에서 움직이는 흰색 배경이에요. |
| Notification Badge (Optional) | segmented-control-notification | 새 소식이 있음을 알리는 점이에요. |
Properties
Number of Controls
Segment는 2~4개로 구성할 수 있어요. 모든 Segment는 가장 넓은 Segment에 맞춰 같은 너비를 가져요.
State
Selected/Unselected 상태로 선택 여부를 표시하고, Enabled, Pressed, Disabled 같은 상호작용 상태를 함께 가져요. 눌렀을 때는 배경은 그대로 두고 라벨만 살짝 작아져요.
Notification
Segment에 새로운 내용이 있다면 notification 으로 Notification Badge를 표시해요. 사용자가 해당 Segment를 확인하면 Badge를 숨겨요.
Long Label
라벨이 길면 줄바꿈되고, 모든 Segment가 가장 높은 Segment에 맞춰 같은 높이를 가져요.
Fixed Width
style 이나 className 으로 너비를 직접 지정할 수 있어요. 지정하지 않으면 콘텐츠에 맞춰져요.
Listening to Value Changes
onValueChange 로 선택 값이 바뀌는 것을 감지할 수 있어요. value 와 함께 쓰면 제어 컴포넌트로 동작해요.
Guidelines
짧고 간단하게 작성하기
라벨은 짧고 간결하게 유지해요. 라벨이 Segment에 비해 너무 길다면 다른 컴포넌트를 쓰는 것을 고려해요.
Segment를 표현하는 라벨은 짧고 간결하게 써요.
라벨이 길면 한눈에 비교하기 어려워요.
4개 이하로 사용하기
선택지가 너무 많아지면 사용자가 인식하기 어렵고, 모바일 환경에서는 터치 영역이 좁아져 사용성이 떨어져요. 옵션을 5개 이상 쓰지 않아요. 더 많은 옵션이 필요하면 Radio Group, Checkbox Group 같은 다른 컴포넌트를 쓰는 것이 좋아요.
한 화면에 한 개만 사용하기
Segmented Control을 한 화면에 반복해서 쓰는 것은 권장하지 않아요. 같은 형태의 컨트롤이 여러 개 있으면 화면의 시각적 계층이 모호해져, 사용자는 어떤 것을 먼저 조작해야 할지, 각 컨트롤이 어느 영역에 영향을 주는지 파악하기 어려워요.
보기 전환하기
Segmented Control은 특정 콘텐츠 영역에 직접 영향을 주는 상호작용에 써요. 같은 데이터를 다른 방식으로 보여줄 때 쓰며, '지도로 보기'와 '목록으로 보기' 전환이 대표적이에요. 사용자는 화면 내용이 즉시 바뀌기를 기대해요.
필터링으로 활용하기
연관된 콘텐츠 그룹을 필터링할 때 Segmented Control을 쓰면 사용자가 보기 안의 콘텐츠 범위를 좁히거나 넓히며 원하는 콘텐츠를 쉽게 찾을 수 있어요.
보기 안에서 콘텐츠 탐색하기
같은 콘텐츠를 여러 관점이나 기준으로 보여주고 싶을 때, Segmented Control로 각 기준을 손쉽게 전환하게 만들 수 있어요.
Segmented Control vs. Tabs
Segmented Control과 Tabs는 생김새가 비슷해 자주 혼동되지만, 목적과 사용법이 분명히 달라요.
핵심적으로 Tabs는 탐색(Navigation)을 위한 것이고, Segmented Control은 조작(Manipulation)을 위한 것이에요.
| Segmented Control | Tabs | |
|---|---|---|
| 핵심 용도 | 화면 안의 콘텐츠를 필터링, 정렬하거나 다른 방식으로 보여줘요 | 서로 다른 콘텐츠를 담은 별개의 섹션이나 페이지로 이동해요 |
| 위치 | 자신이 제어하는 콘텐츠 바로 위에 둬요 | 화면이나 특정 레이아웃의 맨 위에 고정해서 둬요 |
| 영향 범위 | 현재 화면의 특정 부분에만 영향을 줘요 | 탭 아래 콘텐츠 영역 전체를 바꿔요 |
| 동작 | 선택하면 현재 뷰의 데이터만 바뀌어요 | 선택하면 새로운 뷰가 나타나요 |
Segmented Control을 화면 간 이동 같은 탐색 경험에 쓰지 않아요. 이때는 Tabs를 써요.
Props
SegmentedControl
value 와 defaultValue 중 하나는 꼭 지정하고, 접근성을 위해 aria-label 또는 aria-labelledby 를 넣어요.
Prop
Type
SegmentedControlItem
Prop
Type