# Select Box URL: /lynx/components/select-box Source: https://github.com/daangn/seed-design/blob/dev/docs/content/lynx/components/select-box.mdx 명확한 테두리를 가진 컨테이너를 활용하여, 정의된 목록 중 하나 이상의 옵션을 선택하는 UI 요소입니다. Lynx Engine 최소 버전: 3.6 사용 가능 버전: @seed-design/lynx-react@0.6.0, @seed-design/lynx-css@0.10.0 ## Preview ```tsx import "./styles"; import { root } from "@lynx-js/react"; import { HStack, VStack, useSeedClassName } from "@seed-design/lynx-react"; import { CheckSelectBox, CheckSelectBoxCheckmark, CheckSelectBoxGroup, RadioSelectBoxItem, RadioSelectBoxRadiomark, RadioSelectBoxRoot, } from "@/components/ui/select-box"; function Root() { const seedClassName = useSeedClassName({ colorMode: "system" }); return ( } /> } /> } /> } /> } /> } /> ); } root.render(); ``` 문서 미리보기에서는 아이콘 색상이 적용되지 않아요. 아이콘의 실제 색상은 QR 코드 탭에서 Lynx Explorer를 실행해 확인할 수 있어요. ## Installation - npm: npx @seed-design/cli@latest add ui:select-box - pnpm: pnpm dlx @seed-design/cli@latest add ui:select-box - yarn: yarn dlx @seed-design/cli@latest add ui:select-box - bun: bun x @seed-design/cli@latest add ui:select-box ## Props ### Check Select Box #### `CheckSelectBoxGroup` #### `CheckSelectBox` #### `CheckSelectBoxCheckmark` ### Radio Select Box #### `RadioSelectBoxRoot` #### `RadioSelectBoxItem` #### `RadioSelectBoxRadiomark` ## Examples ### Customizing Label `label` prop에 여러 요소를 조합한 사용자 정의 콘텐츠를 전달할 수 있습니다. ```tsx import "./styles"; import { root } from "@lynx-js/react"; import { Badge, HStack, VStack, useSeedClassName } from "@seed-design/lynx-react"; import { CheckSelectBox, CheckSelectBoxCheckmark, CheckSelectBoxGroup, RadioSelectBoxItem, RadioSelectBoxRadiomark, RadioSelectBoxRoot, } from "@/components/ui/select-box"; function CustomizedLabel() { return ( <> Melon New ); } function Root() { const seedClassName = useSeedClassName({ colorMode: "system" }); return ( } /> } description="Elit cupidatat dolore fugiat enim veniam culpa." suffix={} /> } /> } /> } description="Elit cupidatat dolore fugiat enim veniam culpa." suffix={} /> } /> ); } root.render(); ``` ### Listening to Value Changes `CheckSelectBox`는 `onCheckedChange`를 사용하여 체크박스의 선택 상태 변경을 감지할 수 있습니다. `RadioSelectBoxRoot`는 `onValueChange`를 사용하여 라디오 버튼의 선택 값 변경을 감지할 수 있습니다. ```tsx import "./styles"; import { root, useState } from "@lynx-js/react"; import { HStack, VStack, useSeedClassName } from "@seed-design/lynx-react"; import { CheckSelectBox, CheckSelectBoxCheckmark, CheckSelectBoxGroup, RadioSelectBoxItem, RadioSelectBoxRadiomark, RadioSelectBoxRoot, } from "@/components/ui/select-box"; function Root() { const seedClassName = useSeedClassName({ colorMode: "system" }); const [checkCount, setCheckCount] = useState(0); const [checkLastValue, setCheckLastValue] = useState(null); const [radioCount, setRadioCount] = useState(0); const [radioLastValue, setRadioLastValue] = useState(null); return ( } onCheckedChange={(checked) => { setCheckCount((previous) => previous + 1); setCheckLastValue(checked); }} /> onCheckedChange called: {checkCount} times, last value:{" "} {checkLastValue === null ? "-" : JSON.stringify(checkLastValue)} { setRadioCount((previous) => previous + 1); setRadioLastValue(value); }} > } /> } /> onValueChange called: {radioCount} times, last value: {radioLastValue ?? "-"} ); } root.render(); ``` ### Grid Layout (Columns) `columns` prop을 사용하여 여러 열로 배치할 수 있습니다. `columns`가 1보다 크면 하위 요소의 `layout`이 자동으로 `"vertical"`로 설정됩니다. 필요한 경우 `layout` prop을 직접 설정하여 개별 항목의 레이아웃을 오버라이드할 수 있습니다. ```tsx import "./styles"; import IconDiamond from "@karrotmarket/lynx-multicolor-icon/IconDiamond"; import IconIcecreamcone from "@karrotmarket/lynx-multicolor-icon/IconIcecreamcone"; import { root } from "@lynx-js/react"; import { VStack, useSeedClassName } from "@seed-design/lynx-react"; import { CheckSelectBox, CheckSelectBoxCheckmark, CheckSelectBoxGroup, RadioSelectBoxItem, RadioSelectBoxRadiomark, RadioSelectBoxRoot, } from "@/components/ui/select-box"; function Root() { const seedClassName = useSeedClassName({ colorMode: "system" }); return ( } label="옵션 1" description="layout=vertical" suffix={} /> } label="옵션 2" description="layout=vertical" suffix={} /> } defaultChecked layout="horizontal" label="layout=horizontal" description="layout을 horizontal로 오버라이드" suffix={} /> } label="옵션 4" description="layout=vertical" suffix={} /> } label="옵션 1" suffix={} /> } label="옵션 2" suffix={} /> } label="layout=horizontal" description="layout을 horizontal로 오버라이드" layout="horizontal" suffix={} /> } label="옵션 4" suffix={} /> } label="옵션 5" suffix={} /> } label="옵션 6" suffix={} /> ); } root.render(); ``` ### With Suffix `suffix` prop을 사용하여 체크마크, 라디오 마크, 또는 커스텀 요소를 표시할 수 있습니다. `CheckSelectBoxCheckmark`와 `RadioSelectBoxRadiomark`를 사용하거나, 아이콘이나 텍스트 등 자유로운 요소를 전달할 수 있습니다. ```tsx import "./styles"; import IconPersonCircleLine from "@karrotmarket/lynx-monochrome-icon/IconPersonCircleLine"; import { root } from "@lynx-js/react"; import { HStack, VStack, useSeedClassName } from "@seed-design/lynx-react"; import { CheckSelectBox, CheckSelectBoxCheckmark, CheckSelectBoxGroup, RadioSelectBoxItem, RadioSelectBoxRadiomark, RadioSelectBoxRoot, } from "@/components/ui/select-box"; function Root() { const seedClassName = useSeedClassName({ colorMode: "system" }); return ( } /> +1,000원} /> } /> } /> +1,000원} /> } /> ); } root.render(); ``` ### Collapsible Footer `footer` prop으로 추가 콘텐츠를 표시할 수 있습니다. `footerVisibility` prop으로 footer의 표시 조건을 제어할 수 있습니다. - `"when-selected"` (기본값): 항목이 선택되었을 때만 표시 - `"when-not-selected"`: 항목이 선택되지 않았을 때만 표시 - `"always"`: 항상 표시 ```tsx import "./styles"; import { root } from "@lynx-js/react"; import { HStack, VStack, useSeedClassName } from "@seed-design/lynx-react"; import { CheckSelectBox, CheckSelectBoxCheckmark, CheckSelectBoxGroup, RadioSelectBoxItem, RadioSelectBoxRadiomark, RadioSelectBoxRoot, } from "@/components/ui/select-box"; function Root() { const seedClassName = useSeedClassName({ colorMode: "system" }); return ( } footer={선택되었을 때만 보입니다.} /> } footerVisibility="always" footer={항상 보입니다.} /> } footerVisibility="when-not-selected" footer={ 선택되지 않았을 때만 보입니다. } /> } footer={선택되었을 때만 보입니다.} /> } footerVisibility="always" footer={항상 보입니다.} /> } footerVisibility="when-not-selected" footer={ 선택되지 않았을 때만 보입니다. } /> ); } root.render(); ``` ## 웹 버전과의 차이 Lynx `Select Box`는 React 버전과 다음 차이가 있습니다. - **React Hook Form 미지원**: Lynx에는 native form 제출 모델이 없어 React Hook Form 예제를 제공하지 않습니다. - **Field wrapper 없음**: React Registry의 Fieldset과 RadioGroupField 연동, field label, description, error message 연결을 제공하지 않습니다. - **form 제출 없음**: Hidden input과 `inputProps`, `name`, `required`, `invalid`를 제공하지 않습니다. - **키보드 포커스 없음**: 브라우저의 키보드 focus 대신 네이티브 tap과 접근성 탐색을 사용합니다. - **접근성**: HTML ARIA 대신 Lynx의 접근성 역할과 선택 값을 사용합니다.