본문으로 건너뛰기

Toggle

눌린 채로 머무는 버튼입니다. 액션을 실행하지 않고 상태를 유지합니다. 선택한 글자의 굵기, 캔버스의 격자, 목록에 걸린 필터가 그런 상태입니다.

tsx
import { Toggle } from 'neba';

<Toggle defaultPressed>Bold</Toggle>;

Props

Prop타입기본값설명
variant공통'solid' | 'outline' | 'text''outline'토글이 **꺼져 있을 때**의 표면 무게. 켜졌을 때는 어느 weight든 색 계열이 전면에 나섭니다
size공통'xs' | 'sm' | 'md' | 'lg' | 'xl''md'높이와 타입 스케일
color공통'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info''primary'켜졌을 때 띠는 의미론적 색 역할. 꺼져 있으면 어느 계열이든 중립입니다
density공통'default' | 'compact''default'여백만 바꿉니다. 높이와 글자 크기는 그대로
elevation공통0 | 1 | 2 | 30그림자 깊이. 0은 그림자 없음
pressedboolean켜져 있는지 여부. onPressedChange와 함께 쓰면 controlled 컴포넌트가 됩니다
defaultPressedbooleanfalse처음에 켜진 채로 시작할지 여부 (uncontrolled)
onPressedChange(pressed: boolean) => void상태가 바뀔 때마다 호출됩니다
valuestringToggleGroup 안에서 이 토글을 식별하는 값
startIconReactNode라벨 앞의 내용. em 단위라 라벨을 따라갑니다
endIconReactNode라벨 뒤의 내용
disabledbooleanfalse사용 불가. 색 계열을 버리고 중립 회색이 됩니다
fullWidthbooleanfalse컨테이너 너비만큼 확장합니다
childrenReactNode라벨. 없으면 아이콘을 감싸는 정사각형이 되며, 이때는 aria-label이 필요합니다

<button>의 모든 속성이 그대로 전달됩니다. 예외는 ToggleGroup 안에서 토글을 식별하는 value와 의미론적 색 역할인 color뿐입니다. 공통 축은 prop 규칙에 정리되어 있습니다.

Switch는 설정을 바꾸고 그 변화 자체가 목적이며, Checkbox는 폼과 함께 제출되는 답변입니다. Toggle은 둘 다 아닙니다. 옆에 있는 대상에 작용하는 컨트롤입니다.

예시

pressed와 onPressedChange

pressedonPressedChange로 controlled, defaultPressed로 uncontrolled 컴포넌트가 됩니다.

variant

variant는 토글이 꺼져 있을 때의 모습을 정합니다. outline이 기본이고, solid는 켜지면 accent로 채워지는 판이며, text는 hover하거나 켜지기 전까지 표면이 전혀 없습니다.

꺼진 토글은 세 variant 어디에서도 색 계열을 띠지 않습니다. 판은 중립 회백색이고 글자는 muted이며, 켜지는 순간 판과 글자와 hairline이 한꺼번에 accent로 넘어갑니다.

아이콘만 있는 토글

children이 없으면 토글은 startIcon을 감싸는 정사각형이 됩니다. 툴바가 원하는 모양입니다. 아이콘은 접근 가능한 이름을 만들지 못하므로 aria-label을 주세요.

size

size는 Button·TextField·Chip이 쓰는 것과 같은 컨트롤 높이입니다. 여러 컨트롤이 섞인 행에서도 baseline이 유지됩니다.

color

color는 토글이 켜졌을 때 띠는 색입니다. 꺼져 있으면 어느 계열이든 중립입니다.

접근성

  • aria-pressed를 가진 <button>으로 렌더링됩니다.
  • 아이콘만 있는 토글에는 aria-label이 필요합니다. 이름을 가져올 텍스트가 없습니다.
  • ToggleGroup 안에서는 세트 전체가 하나의 tab stop이고, 방향키로 구성원 사이를 이동합니다.

Released under the MIT License