# Radio Group
URL: /react/components/radio-group
Source: https://github.com/daangn/seed-design/blob/dev/docs/content/react/components/radio-group.mdx
여러 옵션 중 하나를 선택할 수 있도록 할 때 사용하는 컴포넌트입니다.
사용 가능 버전: @seed-design/react@0.2.3, @seed-design/css@0.2.3
## Preview
```tsx
import { VStack } from "@seed-design/react";
import { RadioGroup, RadioGroupItem } from "seed-design/ui/radio-group";
export default function RadioGroupPreview() {
return (
);
}
```
## Installation
- npm: npx @seed-design/cli@latest add ui:radio-group
- pnpm: pnpm dlx @seed-design/cli@latest add ui:radio-group
- yarn: yarn dlx @seed-design/cli@latest add ui:radio-group
- bun: bun x @seed-design/cli@latest add ui:radio-group
## Props
### `RadioGroup`
### `RadioGroupItem`
### `Radiomark`
## Examples
### Sizes
```tsx
import { RadioGroup, RadioGroupItem } from "seed-design/ui/radio-group";
import { VStack } from "@seed-design/react";
export default function RadioGroupSize() {
return (
);
}
```
### Tones
#### Brand
```tsx
import { VStack } from "@seed-design/react";
import { RadioGroup, RadioGroupItem } from "seed-design/ui/radio-group";
export default function RadioGroupBrand() {
return (
);
}
```
#### Neutral
```tsx
import { VStack } from "@seed-design/react";
import { RadioGroup, RadioGroupItem } from "seed-design/ui/radio-group";
export default function RadioGroupNeutral() {
return (
);
}
```
### Weights
```tsx
import { VStack } from "@seed-design/react";
import { RadioGroup, RadioGroupItem } from "seed-design/ui/radio-group";
export default function RadioGroupWeights() {
return (
);
}
```
### Long Label
```tsx
import { VStack } from "@seed-design/react";
import { RadioGroup, RadioGroupItem } from "seed-design/ui/radio-group";
export default function RadioGroupLongLabel() {
return (
);
}
```
### Disabled
```tsx
import { VStack } from "@seed-design/react";
import { RadioGroup, RadioGroupItem } from "seed-design/ui/radio-group";
export default function RadioGroupDisabled() {
return (
);
}
```
### Listening to Value Changes
`RadioGroup`의 `onValueChange`를 사용하여 라디오 버튼의 선택 값 변경을 감지할 수 있습니다.
이벤트를 활용해야 하는 경우 `RadioGroupItem`의 `inputProps`를 통해 내부 `` 요소에 직접 이벤트 핸들러를 추가할 수 있습니다.
```tsx
import { VStack, Text } from "@seed-design/react";
import { RadioGroup, RadioGroupItem } from "seed-design/ui/radio-group";
import { useState } from "react";
export default function RadioGroupValueChanges() {
const [count, setCount] = useState(0);
const [lastValue, setLastValue] = useState(null);
return (
{
setCount((prev) => prev + 1);
setLastValue(value);
}}
>
onValueChange called: {count} times, last value: {lastValue ?? "-"}
);
}
```
### Use Cases
#### React Hook Form
```tsx
import { HStack, VStack } from "@seed-design/react";
import { useCallback, type FormEvent } from "react";
import { useController, useForm } from "react-hook-form";
import { ActionButton } from "seed-design/ui/action-button";
import { RadioGroup, RadioGroupItem } from "seed-design/ui/radio-group";
const POSSIBLE_COLORS = ["red", "blue", "green"] as const;
interface FormValues {
color: (typeof POSSIBLE_COLORS)[number];
}
export default function RadioGroupReactHookForm() {
const { handleSubmit, reset, setValue, control } = useForm({
defaultValues: {
color: "blue",
},
});
const { field } = useController({ name: "color", control });
const onValid = useCallback((data: FormValues) => {
window.alert(JSON.stringify(data, null, 2));
}, []);
const onReset = useCallback(
(event: FormEvent) => {
event.preventDefault();
reset();
},
[reset],
);
return (
setValue("color", value as FormValues["color"])}
aria-label="Color selection"
>
{POSSIBLE_COLORS.map((color) => (
))}
Submit
Reset
);
}
```
#### Using `Radiomark`
`Radiomark`는 독립적인 라디오 마크 컴포넌트로, Radio Group Primitive 컴포넌트와 조합하여 커스텀 레이아웃을 위해 사용할 수 있습니다.
```tsx
import { HStack, Text, VStack } from "@seed-design/react";
import { Radiomark } from "seed-design/ui/radio-group";
import { RadioGroup } from "@seed-design/react/primitive";
function CustomRadioGroupItem({ children, ...props }: RadioGroup.ItemProps) {
return (
{children}
);
}
export default function RadioGroupRadiomark() {
return (
regular
medium
bold
);
}
```
### RadioGroupField Integration
`label`, `description`, `errorMessage` 등의 RadioGroupField 관련 prop을 사용할 수 있습니다.
```tsx
import { ActionButton, HStack, VStack } from "@seed-design/react";
import { useState } from "react";
import { RadioGroup, RadioGroupItem } from "seed-design/ui/radio-group";
export default function RadioGroupRadioGroupField() {
const [firstErrorMessage, setFirstErrorMessage] = useState();
const [secondErrorMessage, setSecondErrorMessage] = useState();
const handleFirstSubmit = (e: React.FormEvent) => {
e.preventDefault();
const formData = new FormData(e.currentTarget);
const contact = formData.get("contact");
if (contact === "email") {
setFirstErrorMessage("이메일은 선택할 수 없습니다.");
return;
}
setFirstErrorMessage(undefined);
alert(JSON.stringify({ contact }, null, 2));
};
const handleSecondSubmit = (e: React.FormEvent) => {
e.preventDefault();
const formData = new FormData(e.currentTarget);
const option = formData.get("option");
if (option === "option1") {
setSecondErrorMessage("옵션 1은 선택할 수 없습니다.");
return;
}
setSecondErrorMessage(undefined);
alert(JSON.stringify({ option }, null, 2));
};
return (
);
}
```
## Scale Feedback
`RadioGroupItem`은 눌렸을 때 `Radiomark`가 살짝 줄어드는 피드백을 제공합니다.
`Radiomark`를 감싸는 요소에 [Scale Feedback](/react/components/concepts/scale-feedback)을 직접 적용하는 경우, 바깥 요소와 `Radiomark`가 함께 줄어들어 축소가 이중으로 나타납니다. `Radiomark`의 상위 요소에서 `--seed-radiomark-feedback-scale`을 `1`로 설정하면 `Radiomark`의 축소만 끌 수 있습니다. 이 변수는 상속되므로 `RadioGroupItem` 전체를 감싸는 요소에 설정해도 됩니다.
```css title="MyRow.css"
.my-row {
--seed-radiomark-feedback-scale: 1;
}
```