# Segmented Control URL: /lynx/components/segmented-control Source: https://github.com/daangn/seed-design/blob/dev/docs/content/lynx/components/segmented-control.mdx 여러 옵션 중 하나를 선택하여 관련 콘텐츠를 즉시 필터링하거나 전환할 때 사용하는 컴포넌트입니다. Lynx Engine 최소 버전: 3.6 사용 가능 버전: @seed-design/lynx-react@0.6.0, @seed-design/lynx-css@0.10.0 ## Preview ```tsx import "./styles"; import { useSeedClassName } from "@seed-design/lynx-react"; import { SegmentedControl, SegmentedControlItem } from "@/components/ui/segmented-control"; export default function Example() { const seedClassName = useSeedClassName({ colorMode: "system" }); return ( Hot New ); } ``` ## Installation - npm: npx @seed-design/cli add ui:segmented-control - pnpm: pnpm dlx @seed-design/cli add ui:segmented-control - yarn: yarn dlx @seed-design/cli add ui:segmented-control - bun: bun x @seed-design/cli add ui:segmented-control ## Props ### `SegmentedControl` `value`와 `defaultValue` 중 적어도 하나를 제공해야 선택된 항목과 Indicator를 표시할 수 있습니다. ### `SegmentedControlItem` ## Usage ```tsx import { SegmentedControl, SegmentedControlItem, } from "@/components/ui/segmented-control"; export function App() { return ( 인기순 최신순 ); } ``` Registry의 `SegmentedControl`은 선택 Indicator를 자동으로 추가합니다. ## Examples ### Disabled `SegmentedControl`의 `disabled`는 전체 항목을 비활성화합니다. 각 `SegmentedControlItem`도 따로 비활성화할 수 있습니다. ```tsx import "./styles"; import { useSeedClassName } from "@seed-design/lynx-react"; import { SegmentedControl, SegmentedControlItem } from "@/components/ui/segmented-control"; export default function Example() { const seedClassName = useSeedClassName({ colorMode: "system" }); return ( Hot New Marinara Alfredo Pesto Carbonara Bolognese ); } ``` ### Notification ```tsx import "./styles"; import { useState } from "@lynx-js/react"; import { ActionButton, useSeedClassName } from "@seed-design/lynx-react"; import { SegmentedControl, SegmentedControlItem } from "@/components/ui/segmented-control"; export default function Example() { const seedClassName = useSeedClassName({ colorMode: "system" }); const [sortBy, setSortBy] = useState("monthly"); const [hasSeenAnnual, setHasSeenAnnual] = useState(false); function handleValueChange(value: string) { "background only"; setSortBy(value); if (value === "annual") setHasSeenAnnual(true); } function handleResetNotification() { "background only"; setHasSeenAnnual(false); } return ( Monthly Annual Enterprise Custom Reset Notification ); } ``` ### Long Label ```tsx import "./styles"; import { useSeedClassName } from "@seed-design/lynx-react"; import { SegmentedControl, SegmentedControlItem } from "@/components/ui/segmented-control"; export default function Example() { const seedClassName = useSeedClassName({ colorMode: "system" }); return ( 가격 높은 순 할인율 높은 순 인기 많은 순 ); } ``` ### Fixed Width `SegmentedControl`의 `style`이나 `className`으로 너비를 지정할 수 있습니다. ```tsx import "./styles"; import { useSeedClassName } from "@seed-design/lynx-react"; import { SegmentedControl, SegmentedControlItem } from "@/components/ui/segmented-control"; export default function Example() { const seedClassName = useSeedClassName({ colorMode: "system" }); return ( New Hot One Way Trip Round Trip Multi-City Journey ); } ``` ### Listening to Value Changes `onValueChange`로 선택 값 변경을 감지할 수 있습니다. Controlled 모드에서는 `value`와 함께 사용합니다. ```tsx import "./styles"; import { useState } from "@lynx-js/react"; import { useSeedClassName } from "@seed-design/lynx-react"; import { SegmentedControl, SegmentedControlItem } from "@/components/ui/segmented-control"; export default function Example() { const seedClassName = useSeedClassName({ colorMode: "system" }); const [count, setCount] = useState(0); const [lastValue, setLastValue] = useState(null); function handleValueChange(nextValue: string) { "background only"; setCount((previous) => previous + 1); setLastValue(nextValue); } return ( Hot New onValueChange called: {count} times, last value: {lastValue ?? "-"} ); } ``` ## 웹 버전과의 차이 | 항목 | React Web | Lynx | | --------- | -------------------------- | ------------------------------------- | | 렌더링 요소 | HTML `label`, `input` | 네이티브 `view`, `text` | | 선택 이벤트 | input change | `bindtap`, 공개 상태 이벤트는 `onValueChange` | | 접근성 | ARIA `radiogroup`, `radio` | Lynx `accessibility-*` 속성 | | Indicator | CSS grid와 custom property | Grid layout과 custom property | ## Lynx 미지원 기능 - HTML form 제출을 위한 `ItemHiddenInput`, `name`, `form`, `inputProps` - 키보드 focus와 focus-visible 상호작용 - `SegmentedControlItem`의 `invalid` 상태 Lynx Registry와 package는 `invalid` 상태를 제공하지 않습니다. 이 차이는 의도된 미지원입니다. 오류 상태가 필요하면 앱에서 `SegmentedControl` 가까이에 오류 문구를 표시하고, `accessibility-label`에도 오류 내용을 포함하세요.