Tabs 탭
탭 전환 컴포넌트입니다. 제어 / 비제어, 카드 / 라인 두 가지 외형, 탭 닫기와 추가, 완전한 키보드 내비게이션을 지원합니다.
기본 사용법
import { useState } from 'react'
import { LhTabs, LhTabPane } from '@lh-ui/react'
export default function Demo() {
const [value, setValue] = useState('ink')
return (
<LhTabs value={value} onChange={(name) => setValue(name)}>
<LhTabPane name="ink" label="수묵">
수묵이 번지며 생동감이 감돕니다.
</LhTabPane>
<LhTabPane name="danqing" label="단청">
단청 채색이 금빛으로 빛납니다.
</LhTabPane>
</LhTabs>
)
}
Tabs Props
| 프로퍼티 | 설명 | 타입 | 옵션 | 기본값 |
|---|---|---|---|---|
| value | 현재 활성 탭의 name(제어형) | string | — | — |
| defaultValue | 현재 활성 탭의 name(비제어 기본값) | string | — | — |
| type | 외형 | 'line' | 'card' | — | 'line' |
| closable | 탭 닫기 허용 여부 | boolean | — | false |
| addable | 추가 버튼 표시 여부 | boolean | — | false |
| tabPosition | 탭 위치 | 'top' | 'bottom' | — | 'top' |
| sx | 간편 레이아웃 프로퍼티 | SxProps | — | — |
TabPane Props
| 프로퍼티 | 설명 | 타입 | 기본값 |
|---|---|---|---|
| name | 탭의 고유 식별자(안정적인 키로 사용, 동적 수정은 권장하지 않음) | string | — |
| label | 탭 제목 | ReactNode | — |
| disabled | 비활성화 여부 | boolean | false |
| children | 탭 콘텐츠 | ReactNode | — |
Tabs 이벤트
| 이벤트 | 설명 | 콜백 시그니처 | Vue 대응 |
|---|---|---|---|
| onChange | 활성 탭이 변경될 때 발생 | (name: string) => void | @change |
| onRemove | 탭을 닫을 때 발생(탭의 표시 / 숨김은 비즈니스 측이 제어) | (name: string) => void | @remove |
| onAdd | 추가 버튼 클릭 시 발생 | () => void | @add |
value를 전달하면 제어형, defaultValue를 전달하면 비제어 내부 상태를 사용합니다. 두 모드 모두 onChange가 발생합니다. 활성 탭을 삭제할 때 비제어 모드는 자동으로 인접한 사용 가능 탭으로 전환되고(plus의 getNameAfterRemove에 맞춤), 제어 모드는 비즈니스 측이 onRemove에서 처리합니다.
children은 반드시 직접 LhTabPane이어야 합니다(.map으로 렌더링 가능, Fragment로 평면 감싸기 가능, 단 커스텀 컴포넌트로 감쌀 수는 없음) — 부모 컴포넌트가 Children.forEach로 내려가며 탭 기록을 수집하기 때문에, 커스텀 감싸기 층이 있으면 수집이 실패합니다.
키보드 인터랙션
APG tabs 패턴을 따릅니다: 포커스가 탭 버튼에 있을 때 ArrowRight / ArrowLeft(세로형은 ArrowDown / ArrowUp)가 사용 가능 탭 사이를 이동하면서 활성화하고(비활성화 항목 건너뜀), Home / End는 첫 / 마지막 항목으로, Delete / Backspace는 현재 탭을 닫습니다(closable 필요). 활성 탭만 tabindex=0, 나머지는 -1입니다(roving tabindex).
접근성
탭 바는 role="tablist", 탭은 aria-selected / aria-controls를 가진 role="tab", 패널은 aria-labelledby를 가진 role="tabpanel"이며, id는 useId()로 생성되어 SSR에서 안정적입니다. 비활성 패널은 hidden 속성으로 접근성 트리에서 제외됩니다.
ref
forwardRef<HTMLDivElement> — 루트 요소. LhTabPane은 HTMLDivElement를 전달합니다.
스타일
import '@lh-ui/react/theme.css'
import '@lh-ui/react/style/tabs'