Chip Tabs
Chip 형태로 표현된 탭 컴포넌트입니다. 카테고리나 필터를 선택하여 콘텐츠를 전환할 때 사용합니다.
<viewpager><viewpager-item>Installation
의존성 설치
아래 코드를 복사 후 붙여넣고 사용하세요
Props
ChipTabsRoot
Prop
Type
value?string | undefineddefaultValue?string | undefinedonValueChange?((value: string) => void) | undefinedstyle?CSSProperties | undefinedchildren?ReactNodeclassName?string | undefinedChipTabsList
Prop
Type
style?CSSProperties | undefinedchildren?ReactNodeclassName?string | undefinedmain-thread:bindbgload?EventHandler<BaseImageLoadEvent<Element>> | undefinedmain-thread:catchbgload?EventHandler<BaseImageLoadEvent<Element>> | undefinedmain-thread:capture-bindbgload?EventHandler<BaseImageLoadEvent<Element>> | undefinedmain-thread:capture-catchbgload?EventHandler<BaseImageLoadEvent<Element>> | undefinedmain-thread:global-bindbgload?EventHandler<BaseImageLoadEvent<Element>> | undefinedmain-thread:bindbgerror?EventHandler<BaseImageErrorEvent<Element>> | undefinedmain-thread:catchbgerror?EventHandler<BaseImageErrorEvent<Element>> | undefinedmain-thread:capture-bindbgerror?EventHandler<BaseImageErrorEvent<Element>> | undefinedmain-thread:capture-catchbgerror?EventHandler<BaseImageErrorEvent<Element>> | undefinedmain-thread:global-bindbgerror?EventHandler<BaseImageErrorEvent<Element>> | undefinedmain-thread:bindtouchstart?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:catchtouchstart?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:capture-bindtouchstart?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:capture-catchtouchstart?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:global-bindtouchstart?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:bindtouchmove?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:catchtouchmove?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:capture-bindtouchmove?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:capture-catchtouchmove?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:global-bindtouchmove?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:bindtouchcancel?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:catchtouchcancel?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:capture-bindtouchcancel?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:capture-catchtouchcancel?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:global-bindtouchcancel?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:bindtouchend?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:catchtouchend?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:capture-bindtouchend?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:capture-catchtouchend?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:global-bindtouchend?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:bindlongpress?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:catchlongpress?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:capture-bindlongpress?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:capture-catchlongpress?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:global-bindlongpress?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:bindtransitionstart?EventHandler<BaseTransitionEvent<Element>> | undefinedmain-thread:catchtransitionstart?EventHandler<BaseTransitionEvent<Element>> | undefinedmain-thread:capture-bindtransitionstart?EventHandler<BaseTransitionEvent<Element>> | undefinedmain-thread:capture-catchtransitionstart?EventHandler<BaseTransitionEvent<Element>> | undefinedmain-thread:global-bindtransitionstart?EventHandler<BaseTransitionEvent<Element>> | undefinedmain-thread:bindtransitioncancel?EventHandler<BaseTransitionEvent<Element>> | undefinedmain-thread:catchtransitioncancel?EventHandler<BaseTransitionEvent<Element>> | undefinedmain-thread:capture-bindtransitioncancel?EventHandler<BaseTransitionEvent<Element>> | undefinedmain-thread:capture-catchtransitioncancel?EventHandler<BaseTransitionEvent<Element>> | undefinedmain-thread:global-bindtransitioncancel?EventHandler<BaseTransitionEvent<Element>> | undefinedmain-thread:bindtransitionend?EventHandler<BaseTransitionEvent<Element>> | undefinedmain-thread:catchtransitionend?EventHandler<BaseTransitionEvent<Element>> | undefinedmain-thread:capture-bindtransitionend?EventHandler<BaseTransitionEvent<Element>> | undefinedmain-thread:capture-catchtransitionend?EventHandler<BaseTransitionEvent<Element>> | undefinedmain-thread:global-bindtransitionend?EventHandler<BaseTransitionEvent<Element>> | undefinedmain-thread:bindanimationstart?EventHandler<BaseAnimationEvent<Element>> | undefinedmain-thread:catchanimationstart?EventHandler<BaseAnimationEvent<Element>> | undefinedmain-thread:capture-bindanimationstart?EventHandler<BaseAnimationEvent<Element>> | undefinedmain-thread:capture-catchanimationstart?EventHandler<BaseAnimationEvent<Element>> | undefinedmain-thread:global-bindanimationstart?EventHandler<BaseAnimationEvent<Element>> | undefinedmain-thread:bindanimationiteration?EventHandler<BaseAnimationEvent<Element>> | undefinedmain-thread:catchanimationiteration?EventHandler<BaseAnimationEvent<Element>> | undefinedmain-thread:capture-bindanimationiteration?EventHandler<BaseAnimationEvent<Element>> | undefinedmain-thread:capture-catchanimationiteration?EventHandler<BaseAnimationEvent<Element>> | undefinedmain-thread:global-bindanimationiteration?EventHandler<BaseAnimationEvent<Element>> | undefinedmain-thread:bindanimationcancel?EventHandler<BaseAnimationEvent<Element>> | undefinedmain-thread:catchanimationcancel?EventHandler<BaseAnimationEvent<Element>> | undefinedmain-thread:capture-bindanimationcancel?EventHandler<BaseAnimationEvent<Element>> | undefinedmain-thread:capture-catchanimationcancel?EventHandler<BaseAnimationEvent<Element>> | undefinedmain-thread:global-bindanimationcancel?EventHandler<BaseAnimationEvent<Element>> | undefinedmain-thread:bindanimationend?EventHandler<BaseAnimationEvent<Element>> | undefinedmain-thread:catchanimationend?EventHandler<BaseAnimationEvent<Element>> | undefinedmain-thread:capture-bindanimationend?EventHandler<BaseAnimationEvent<Element>> | undefinedmain-thread:capture-catchanimationend?EventHandler<BaseAnimationEvent<Element>> | undefinedmain-thread:global-bindanimationend?EventHandler<BaseAnimationEvent<Element>> | undefinedmain-thread:bindmousedown?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:catchmousedown?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:capture-bindmousedown?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:capture-catchmousedown?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:global-bindmousedown?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:bindmouseup?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:catchmouseup?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:capture-bindmouseup?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:capture-catchmouseup?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:global-bindmouseup?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:bindmousemove?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:catchmousemove?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:capture-bindmousemove?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:capture-catchmousemove?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:global-bindmousemove?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:bindmouseenter?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:catchmouseenter?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:capture-bindmouseenter?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:capture-catchmouseenter?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:global-bindmouseenter?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:bindmouseleave?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:catchmouseleave?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:capture-bindmouseleave?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:capture-catchmouseleave?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:global-bindmouseleave?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:bindmouseclick?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:catchmouseclick?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:capture-bindmouseclick?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:capture-catchmouseclick?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:global-bindmouseclick?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:bindmousedblclick?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:catchmousedblclick?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:capture-bindmousedblclick?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:capture-catchmousedblclick?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:global-bindmousedblclick?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:bindmouselongpress?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:catchmouselongpress?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:capture-bindmouselongpress?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:capture-catchmouselongpress?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:global-bindmouselongpress?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:bindwheel?EventHandler<BaseWheelEvent<Element>> | undefinedmain-thread:catchwheel?EventHandler<BaseWheelEvent<Element>> | undefinedmain-thread:capture-bindwheel?EventHandler<BaseWheelEvent<Element>> | undefinedmain-thread:capture-catchwheel?EventHandler<BaseWheelEvent<Element>> | undefinedmain-thread:global-bindwheel?EventHandler<BaseWheelEvent<Element>> | undefinedmain-thread:bindzoom?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:catchzoom?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:capture-bindzoom?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:capture-catchzoom?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:global-bindzoom?EventHandler<BaseMouseEvent<Element>> | undefinedmain-thread:bindkeydown?EventHandler<BaseKeyEvent<Element>> | undefinedmain-thread:catchkeydown?EventHandler<BaseKeyEvent<Element>> | undefinedmain-thread:capture-bindkeydown?EventHandler<BaseKeyEvent<Element>> | undefinedmain-thread:capture-catchkeydown?EventHandler<BaseKeyEvent<Element>> | undefinedmain-thread:global-bindkeydown?EventHandler<BaseKeyEvent<Element>> | undefinedmain-thread:bindkeyup?EventHandler<BaseKeyEvent<Element>> | undefinedmain-thread:catchkeyup?EventHandler<BaseKeyEvent<Element>> | undefinedmain-thread:capture-bindkeyup?EventHandler<BaseKeyEvent<Element>> | undefinedmain-thread:capture-catchkeyup?EventHandler<BaseKeyEvent<Element>> | undefinedmain-thread:global-bindkeyup?EventHandler<BaseKeyEvent<Element>> | undefinedmain-thread:bindfocus?EventHandler<BaseCommonEvent<Element>> | undefinedmain-thread:catchfocus?EventHandler<BaseCommonEvent<Element>> | undefinedmain-thread:capture-bindfocus?EventHandler<BaseCommonEvent<Element>> | undefinedmain-thread:capture-catchfocus?EventHandler<BaseCommonEvent<Element>> | undefinedmain-thread:global-bindfocus?EventHandler<BaseCommonEvent<Element>> | undefinedmain-thread:bindblur?EventHandler<BaseCommonEvent<Element>> | undefinedmain-thread:catchblur?EventHandler<BaseCommonEvent<Element>> | undefinedmain-thread:capture-bindblur?EventHandler<BaseCommonEvent<Element>> | undefinedmain-thread:capture-catchblur?EventHandler<BaseCommonEvent<Element>> | undefinedmain-thread:global-bindblur?EventHandler<BaseCommonEvent<Element>> | undefinedmain-thread:bindlayoutchange?EventHandler<LayoutChangeDetailEvent<Element>> | undefinedmain-thread:catchlayoutchange?EventHandler<LayoutChangeDetailEvent<Element>> | undefinedmain-thread:capture-bindlayoutchange?EventHandler<LayoutChangeDetailEvent<Element>> | undefinedmain-thread:capture-catchlayoutchange?EventHandler<LayoutChangeDetailEvent<Element>> | undefinedmain-thread:global-bindlayoutchange?EventHandler<LayoutChangeDetailEvent<Element>> | undefinedmain-thread:binduiappear?EventHandler<UIAppearanceDetailEvent<Element>> | undefinedmain-thread:catchuiappear?EventHandler<UIAppearanceDetailEvent<Element>> | undefinedmain-thread:capture-binduiappear?EventHandler<UIAppearanceDetailEvent<Element>> | undefinedmain-thread:capture-catchuiappear?EventHandler<UIAppearanceDetailEvent<Element>> | undefinedmain-thread:global-binduiappear?EventHandler<UIAppearanceDetailEvent<Element>> | undefinedmain-thread:binduidisappear?EventHandler<UIAppearanceDetailEvent<Element>> | undefinedmain-thread:catchuidisappear?EventHandler<UIAppearanceDetailEvent<Element>> | undefinedmain-thread:capture-binduidisappear?EventHandler<UIAppearanceDetailEvent<Element>> | undefinedmain-thread:capture-catchuidisappear?EventHandler<UIAppearanceDetailEvent<Element>> | undefinedmain-thread:global-binduidisappear?EventHandler<UIAppearanceDetailEvent<Element>> | undefinedmain-thread:bindaccessibilityaction?EventHandler<AccessibilityActionDetailEvent<Element>> | undefinedmain-thread:catchaccessibilityaction?EventHandler<AccessibilityActionDetailEvent<Element>> | undefinedmain-thread:capture-bindaccessibilityaction?EventHandler<AccessibilityActionDetailEvent<Element>> | undefinedmain-thread:capture-catchaccessibilityaction?EventHandler<AccessibilityActionDetailEvent<Element>> | undefinedmain-thread:global-bindaccessibilityaction?EventHandler<AccessibilityActionDetailEvent<Element>> | undefinedmain-thread:bindtap?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:catchtap?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:capture-bindtap?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:capture-catchtap?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:global-bindtap?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:bindlongtap?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:catchlongtap?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:capture-bindlongtap?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:capture-catchlongtap?EventHandler<BaseTouchEvent<Element>> | undefinedmain-thread:global-bindlongtap?EventHandler<BaseTouchEvent<Element>> | undefinedChipTabsTrigger
Prop
Type
notification?boolean | undefineddisabled?boolean | undefinedvaluestringstyle?CSSProperties | undefinedchildrenstring | numberclassName?string | undefinedbindtap?EventHandler<BaseTouchEvent<Target>> | undefinedaccessibility-label?string | undefinedChipTabsCarousel
Prop
Type
swipeable?boolean | undefinedonSettle?(() => void) | undefinedstyle?CSSProperties | undefinedchildren?ReactNodeclassName?string | undefinedChipTabsContent
Prop
Type
valuestringstyle?CSSProperties | undefinedchildren?ReactNodeclassName?string | undefinedUsage
ChipTabsRoot는 value와 onValueChange로 제어하거나 defaultValue로 초기 선택 값을 지정합니다. ChipTabsTrigger의 notification boolean은 label 옆 6px 간격에 작은 NotificationBadge를 표시합니다.
ChipTabsCarousel은 Registry에서 ChipTabsCarouselCamera를 조립하므로 ChipTabsContent만 자식으로 전달합니다. Carousel은 native <viewpager>이므로 Carousel 또는 Camera에 앱 레이아웃에 맞는 높이를 명시하고, swipeable로 좌우 스와이프를 켭니다. iOS의 화면 왼쪽 가장자리 뒤로가기 제스처를 우선할 범위는 iosBackGestureEdgeWidth로 정합니다.
공개 package API에서 Camera의 native bindchange, bindwillchange, bindoffsetchange를 직접 사용해야 할 때는 ChipTabs.CarouselCamera를 조합합니다. onSwipeStart, onSwipeEnd, onSettle은 Carousel에 전달해 스와이프 시작·종료·정착을 처리할 수 있습니다.
Scroll Alignment
ChipTabsList의 scrollAlign은 선택한 chip을 가로 목록에 맞추는 방식입니다. "nearest", "start", "center", "end"를 사용할 수 있으며 기본값은 "nearest"입니다.
"start","center","end"는 선택한 chip을 각각 목록의 시작, 가운데, 끝에 맞춥니다."nearest"는 React Web의 최소 스크롤 동작과 같이 선택한 chip이 완전히 보이면 현재 위치를 유지합니다. 왼쪽이 잘렸을 때는 시작 경계까지, 오른쪽이 잘렸을 때는 끝 경계까지 필요한 만큼만 이동하므로"end"처럼 항상 끝에 맞추지 않습니다.
실제 chip의 너비와 위치, viewport를 기준으로 계산하며, 가변 너비 chip도 그대로 유지합니다. 목록의 첫·마지막 항목을 가운데에 맞추기 위해 빈 공간을 추가하지 않고 스크롤 가능한 범위 안에서만 이동하며 항목 순서도 바꾸지 않습니다.
아래 예제에서 모드를 고르면 선택을 라벨1로 초기화합니다. 그 뒤 라벨6을 탭하거나 6번 선택을 탭해 controlled value 변경에서도 실제 scrollAlign 차이를 확인하세요. nearest를 고르면 scrollAlign prop을 생략하여 기본 동작도 함께 확인합니다.
nearest에서 선택한 chip이 이미 완전히 보인 상태로 다시 선택하면 이동하지 않습니다. 목록을 직접 스크롤한 뒤에도 다음 선택이 필요한 경우에만 이동합니다.
Examples
Size=Medium
medium의 최소 높이는 36px입니다.
Size=Large
large의 최소 높이는 40px입니다.
Variant=Neutral Solid
Variant=Neutral Outline
Notification
With Scroll Fog
ScrollFog는 Registry snippet이나 Recipe 없이 @seed-design/lynx-react 패키지에서 직접 제공되는 package-only 공개 컴포넌트입니다. ChipTabsList를 placement={["left", "right"]}인 ScrollFog로 감싸면 기본 20px fog가 좌우 edge에 표시됩니다. List의 내부 좌우 padding 16px은 그대로 유지합니다.
Web Version Differences
| 항목 | React Web | Lynx |
|---|---|---|
| 렌더링 요소 | HTML div, button | 네이티브 view, text, scroll-view, viewpager |
| 탭 선택 이벤트 | onClick 기반 | bindtap 기반, 공개 상태 이벤트는 onValueChange |
| 콘텐츠 | Root 바깥의 조건부 div도 사용 가능 | Root 바깥에서 value에 따른 조건부 native text를 렌더링할 수 있음 |
| 가로 List | CSS overflow | 네이티브 가로 scroll-view |
| Carousel | 웹 Carousel | 네이티브 <viewpager> |
React 예제와 마찬가지로 Lynx에서도 Root 바깥에서 선택 값에 따라 조건부 native text 콘텐츠를 렌더링할 수 있습니다. 별도 AppBar, 화면 shell, CTA, asset은 제공하지 않습니다.
Unsupported Lynx Features
- 키보드 포커스와 roving focus
- RTL 순서와 스와이프 방향 반전
lazyMount,unmountOnExit: native viewpager는 모든 page slot을 유지합니다.- Carousel의
loop,autoHeight,dragThreshold,carouselPreventDrag - 콘텐츠 전환 애니메이션
Last updated on