# Chip Tabs URL: /lynx/components/chip-tabs Source: https://github.com/daangn/seed-design/blob/dev/docs/content/lynx/components/chip-tabs.mdx Chip 형태로 표현된 탭 컴포넌트입니다. 카테고리나 필터를 선택하여 콘텐츠를 전환할 때 사용합니다. Lynx Engine 최소 버전: 3.9 사용 XElement: , 사용 가능 버전: @seed-design/lynx-react@0.8.0, @seed-design/lynx-css@0.12.0 ## Preview ```tsx import "./styles"; import { ChipTabsContent, ChipTabsList, ChipTabsRoot, ChipTabsTrigger, } from "@/components/ui/chip-tabs"; export default function Example() { return ( 라벨1 라벨2 라벨3 Content 1 Content 2 Content 3 ); } ``` ## Installation - npm: npx @seed-design/cli add ui:chip-tabs - pnpm: pnpm dlx @seed-design/cli add ui:chip-tabs - yarn: yarn dlx @seed-design/cli add ui:chip-tabs - bun: bun x @seed-design/cli add ui:chip-tabs ## Props ### `ChipTabsRoot` ### `ChipTabsList` ### `ChipTabsTrigger` ### `ChipTabsCarousel` ### `ChipTabsContent` ## Usage ### Content 탭 선택으로만 콘텐츠를 전환할 때는 `ChipTabsContent`를 `ChipTabsRoot` 안에 배치합니다. Trigger와 Content의 `value`를 맞추면 선택된 패널만 표시됩니다. 이 구성은 콘텐츠 높이에 맞춰 배치되며 좌우 스와이프는 제공하지 않습니다. ```tsx import { ChipTabsContent, ChipTabsList, ChipTabsRoot, ChipTabsTrigger, } from "@/components/ui/chip-tabs"; export function App() { return ( 라벨1 라벨2 라벨3 첫 번째 콘텐츠 두 번째 콘텐츠 세 번째 콘텐츠 ); } ``` `ChipTabsRoot`는 `value`와 `onValueChange`로 제어하거나 `defaultValue`로 초기 선택 값을 지정합니다. `notification`을 설정한 Trigger에는 알림 배지가 표시됩니다. ### Swipeable 콘텐츠를 좌우로 밀어 탭을 바꾸려면 `ChipTabsContent`를 `ChipTabsCarousel` 안에 배치하고 `swipeable`을 설정합니다. Carousel에 앱 레이아웃에 맞는 높이를 지정하세요. iOS의 뒤로 가기 제스처 범위는 `iosBackGestureEdgeWidth`로 조절할 수 있습니다. ```tsx import "./styles"; import { ChipTabsCarousel, ChipTabsContent, ChipTabsList, ChipTabsRoot, ChipTabsTrigger, } from "@/components/ui/chip-tabs"; export default function Example() { return ( 라벨1 라벨2 라벨3 Content 1 Content 2 Content 3 ); } ``` ## Scroll Alignment `ChipTabsList`의 `scrollAlign`은 선택한 chip을 가로 목록에 맞추는 방식입니다. `"nearest"`, `"start"`, `"center"`, `"end"`를 지원하며 기본값은 `"nearest"`입니다. `"nearest"`는 선택한 chip이 완전히 보이면 이동하지 않고, 일부가 가려졌을 때만 필요한 만큼 스크롤합니다. ```tsx import "./styles"; import { useState } from "@lynx-js/react"; import { ActionButton, Box, HStack, Text, VStack } from "@seed-design/lynx-react"; import { ChipTabsList, ChipTabsRoot, ChipTabsTrigger, type ChipTabsListProps, } from "@/components/ui/chip-tabs"; type ScrollAlign = NonNullable; const ALIGNMENTS: ScrollAlign[] = ["nearest", "start", "center", "end"]; const LABELS = Array.from({ length: 15 }, (_, index) => String(index + 1)); export default function Example() { const [value, setValue] = useState("1"); const [scrollAlign, setScrollAlign] = useState("nearest"); function handleValueChange(nextValue: string) { "background only"; setValue(nextValue); } function selectScrollAlign(nextScrollAlign: ScrollAlign) { "background only"; setScrollAlign(nextScrollAlign); setValue("1"); } function selectSixthChip() { "background only"; setValue("6"); } return ( {ALIGNMENTS.map((nextScrollAlign) => ( { "background only"; selectScrollAlign(nextScrollAlign); }} > {nextScrollAlign} ))} 6번 선택 {`선택: 라벨${value}`} {LABELS.map((label) => ( {`라벨${label}`} ))} ); } ``` ## Examples ### Size=Medium `medium`의 최소 높이는 36px입니다. ```tsx import "./styles"; import { useState } from "@lynx-js/react"; import { ChipTabsList, ChipTabsRoot, ChipTabsTrigger } from "@/components/ui/chip-tabs"; export default function Example() { const [value, setValue] = useState("1"); function handleValueChange(nextValue: string) { "background only"; setValue(nextValue); } return ( 라벨1 라벨2 라벨3 {value === "1" && content 1} {value === "2" && content 2} {value === "3" && content 3} ); } ``` ### Size=Large `large`의 최소 높이는 40px입니다. ```tsx import "./styles"; import { useState } from "@lynx-js/react"; import { ChipTabsList, ChipTabsRoot, ChipTabsTrigger } from "@/components/ui/chip-tabs"; export default function Example() { const [value, setValue] = useState("1"); function handleValueChange(nextValue: string) { "background only"; setValue(nextValue); } return ( 라벨1 라벨2 라벨3 {value === "1" && content 1} {value === "2" && content 2} {value === "3" && content 3} ); } ``` ### Variant=Neutral Solid ```tsx import "./styles"; import { useState } from "@lynx-js/react"; import { ChipTabsList, ChipTabsRoot, ChipTabsTrigger } from "@/components/ui/chip-tabs"; export default function Example() { const [value, setValue] = useState("1"); function handleValueChange(nextValue: string) { "background only"; setValue(nextValue); } return ( 라벨1 라벨2 라벨3 {value === "1" && content 1} {value === "2" && content 2} {value === "3" && content 3} ); } ``` ### Variant=Neutral Outline ```tsx import "./styles"; import { useState } from "@lynx-js/react"; import { ChipTabsList, ChipTabsRoot, ChipTabsTrigger } from "@/components/ui/chip-tabs"; export default function Example() { const [value, setValue] = useState("1"); function handleValueChange(nextValue: string) { "background only"; setValue(nextValue); } return ( 라벨1 라벨2 라벨3 {value === "1" && content 1} {value === "2" && content 2} {value === "3" && content 3} ); } ``` ### Notification ```tsx import "./styles"; import { useState } from "@lynx-js/react"; import { ChipTabsList, ChipTabsRoot, ChipTabsTrigger } from "@/components/ui/chip-tabs"; export default function Example() { const [value, setValue] = useState("1"); function handleValueChange(nextValue: string) { "background only"; setValue(nextValue); } return ( 라벨1 라벨2 라벨3 {value === "1" && content 1} {value === "2" && content 2} {value === "3" && content 3} ); } ``` ### With Scroll Fog `ChipTabsList`를 `placement={["left", "right"]}`인 `ScrollFog`로 감싸면 좌우에 fog를 표시할 수 있습니다. ```tsx import "./styles"; import { ScrollFog } from "@seed-design/lynx-react"; import { ChipTabsList, ChipTabsRoot, ChipTabsTrigger } from "@/components/ui/chip-tabs"; export default function Example() { return ( 라벨1 라벨2 라벨3 라벨4 라벨5 라벨6 라벨7 라벨8 라벨9 라벨10 라벨11 라벨12 라벨13 라벨14 라벨15 ); } ``` ## Web Version Differences - 탭 이벤트는 `onClick` 대신 `bindtap`으로 받습니다. - Carousel은 네이티브 ``, 가로 탭 목록은 ``를 사용합니다. - Root 밖에서 선택 값에 따라 네이티브 콘텐츠를 조건부로 렌더링할 수 있습니다. ## Unsupported Lynx Features - 키보드 포커스와 roving focus - RTL 순서와 스와이프 방향 반전 - `lazyMount`, `unmountOnExit` - Carousel의 `loop`, `autoHeight`, `dragThreshold`, `carouselPreventDrag` - 콘텐츠 전환 애니메이션