# 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; } ```