radio-group.tsx raw
1 import * as React from "react";
2 import { CircleIcon } from "lucide-react";
3 import { RadioGroup as RadioGroupPrimitive } from "radix-ui";
4
5 import { cn } from "src/lib/utils";
6
7 function RadioGroup({
8 className,
9 ...props
10 }: React.ComponentProps<typeof RadioGroupPrimitive.Root>) {
11 return (
12 <RadioGroupPrimitive.Root
13 data-slot="radio-group"
14 className={cn("grid gap-3", className)}
15 {...props}
16 />
17 );
18 }
19
20 function RadioGroupItem({
21 className,
22 ...props
23 }: React.ComponentProps<typeof RadioGroupPrimitive.Item>) {
24 return (
25 <RadioGroupPrimitive.Item
26 data-slot="radio-group-item"
27 className={cn(
28 "aspect-square size-4 shrink-0 rounded-full border border-input text-primary shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:bg-input/30 dark:aria-invalid:ring-destructive/40",
29 className
30 )}
31 {...props}
32 >
33 <RadioGroupPrimitive.Indicator
34 data-slot="radio-group-indicator"
35 className="relative flex items-center justify-center"
36 >
37 <CircleIcon className="absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2 fill-primary" />
38 </RadioGroupPrimitive.Indicator>
39 </RadioGroupPrimitive.Item>
40 );
41 }
42
43 export { RadioGroup, RadioGroupItem };
44