# 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`을 지정하세요.