# 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 { HStack, VStack } from "@seed-design/lynx-react"; import { CheckSelectBox, CheckSelectBoxCheckmark, CheckSelectBoxGroup, RadioSelectBoxItem, RadioSelectBoxRadiomark, RadioSelectBoxRoot, } from "@/components/ui/select-box"; export default function Example() { return ( } /> } /> } /> } /> } /> } /> ); } ``` ## 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` 고유 prop이 없습니다. `className`, `style`, `children`을 받습니다. ### Radio Select Box #### `RadioSelectBoxRoot` `RadioSelectBoxRoot`는 `label`, `description`, `errorMessage`, `invalid`를 지원합니다. `invalid`가 `true`이고 `errorMessage`가 있으면 description 대신 오류 메시지를 표시합니다. `columns`는 항목의 열 수를 지정합니다. `className`과 `style`은 그룹 바깥의 Root에 적용됩니다. #### `RadioSelectBoxItem` #### `RadioSelectBoxRadiomark` ## Examples ### Customizing Label `label` prop에 여러 요소를 조합한 사용자 정의 콘텐츠를 전달할 수 있습니다. ```tsx import "./styles"; import { HStack, VStack } from "@seed-design/lynx-react"; import { Badge } from "@/components/ui/badge"; import { CheckSelectBox, CheckSelectBoxCheckmark, CheckSelectBoxGroup, RadioSelectBoxItem, RadioSelectBoxRadiomark, RadioSelectBoxRoot, } from "@/components/ui/select-box"; function CustomizedLabel() { return ( <> Melon New ); } export default function Example() { return ( } /> } description="Elit cupidatat dolore fugiat enim veniam culpa." suffix={} /> } /> } /> } description="Elit cupidatat dolore fugiat enim veniam culpa." suffix={} /> } /> ); } ``` ### Listening to Value Changes `CheckSelectBox`는 `onCheckedChange`를 사용하여 체크박스의 선택 상태 변경을 감지할 수 있습니다. `RadioSelectBoxRoot`는 `onValueChange`를 사용하여 라디오 버튼의 선택 값 변경을 감지할 수 있습니다. ```tsx import "./styles"; import { useState } from "@lynx-js/react"; import { HStack, VStack } from "@seed-design/lynx-react"; import { CheckSelectBox, CheckSelectBoxCheckmark, CheckSelectBoxGroup, RadioSelectBoxItem, RadioSelectBoxRadiomark, RadioSelectBoxRoot, } from "@/components/ui/select-box"; export default function Example() { 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 ?? "-"} ); } ``` ### Grid Layout (Columns) `columns` prop을 사용하여 여러 열로 배치할 수 있습니다. `columns`가 1보다 크면 하위 요소의 `layout`이 자동으로 `"vertical"`로 설정됩니다. 가로형(`layout="horizontal"`)은 단일 컬럼으로 배치합니다. 여러 열로 구성한 그룹에서 개별 항목을 가로형으로 바꾸려면, 아래 예제처럼 래퍼가 모든 열을 차지하도록 `gridColumnStart`와 `gridColumnEnd`를 지정해 전체 너비를 확보하세요. 래퍼는 `HStack align="stretch"`로 구성해 내부 Select Box가 grid 행 높이를 채우도록 합니다. ```tsx import "./styles"; import IconDiamond from "@karrotmarket/lynx-multicolor-icon/IconDiamond"; import IconIcecreamcone from "@karrotmarket/lynx-multicolor-icon/IconIcecreamcone"; import { HStack, VStack } from "@seed-design/lynx-react"; import { CheckSelectBox, CheckSelectBoxCheckmark, CheckSelectBoxGroup, RadioSelectBoxItem, RadioSelectBoxRadiomark, RadioSelectBoxRoot, } from "@/components/ui/select-box"; export default function Example() { 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={} /> ); } ``` ### With Suffix `suffix` prop을 사용하여 체크마크, 라디오 마크, 또는 커스텀 요소를 표시할 수 있습니다. `CheckSelectBoxCheckmark`와 `RadioSelectBoxRadiomark`를 사용하거나, 아이콘이나 텍스트 등 자유로운 요소를 전달할 수 있습니다. ```tsx import "./styles"; import IconPersonCircleLine from "@karrotmarket/lynx-monochrome-icon/IconPersonCircleLine"; import { HStack, VStack } from "@seed-design/lynx-react"; import { CheckSelectBox, CheckSelectBoxCheckmark, CheckSelectBoxGroup, RadioSelectBoxItem, RadioSelectBoxRadiomark, RadioSelectBoxRoot, } from "@/components/ui/select-box"; export default function Example() { return ( } /> +1,000원} /> } /> } /> +1,000원} /> } /> ); } ``` ### Collapsible Footer `footer` prop으로 추가 콘텐츠를 표시할 수 있습니다. `footerVisibility` prop으로 footer의 표시 조건을 제어할 수 있습니다. - `"when-selected"` (기본값): 항목이 선택되었을 때만 표시 - `"when-not-selected"`: 항목이 선택되지 않았을 때만 표시 - `"always"`: 항상 표시 ```tsx import "./styles"; import { HStack, VStack } from "@seed-design/lynx-react"; import { CheckSelectBox, CheckSelectBoxCheckmark, CheckSelectBoxGroup, RadioSelectBoxItem, RadioSelectBoxRadiomark, RadioSelectBoxRoot, } from "@/components/ui/select-box"; export default function Example() { return ( } footer={선택되었을 때만 보입니다.} /> } footerVisibility="always" footer={항상 보입니다.} /> } footerVisibility="when-not-selected" footer={ 선택되지 않았을 때만 보입니다. } /> } footer={선택되었을 때만 보입니다.} /> } footerVisibility="always" footer={항상 보입니다.} /> } footerVisibility="when-not-selected" footer={ 선택되지 않았을 때만 보입니다. } /> ); } ``` ## 웹 버전과의 차이 - Lynx에는 native form 제출 모델이 없어 React Hook Form, hidden input, `name`, `required`를 제공하지 않습니다. 선택 값과 오류 상태를 앱에서 관리하세요. - 라디오 그룹은 label, description, error message를 지원합니다. 체크박스 그룹은 React Registry의 Fieldset 연동을 제공하지 않습니다. - 브라우저 키보드 focus 대신 native tap과 접근성 탐색을 사용합니다. - 각 항목은 독립된 접근성 요소입니다. raw ``를 포함하거나 텍스트가 없는 항목에는 `accessibility-label`을 지정하세요.