{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "radio-group", "title": "Integrated Radio Group", "description": "Flat items-driven RadioGroup built on shadcn's base-ui RadioGroup: per-option label, description, and disabled, with accessible label/description wiring and class overrides.", "registryDependencies": [ "radio-group" ], "files": [ { "path": "registry/ui/radio-group.tsx", "content": "\"use client\";\n\nimport type { RadioGroup as RadioGroupPrimitive } from \"@base-ui/react/radio-group\";\nimport type { ClassValue } from \"clsx\";\nimport { type ReactNode, useId } from \"react\";\nimport {\n RadioGroupItem as RadioGroupItemPrimitive,\n RadioGroup as RadioGroupRoot,\n} from \"@/components/ui/radio-group\";\nimport { cn } from \"@/lib/utils\";\n\nexport interface RadioGroupItem {\n description?: ReactNode;\n descriptionClassName?: ClassValue;\n disabled?: boolean;\n itemClassName?: ClassValue;\n label: ReactNode;\n labelClassName?: ClassValue;\n optionClassName?: ClassValue;\n value: string;\n}\n\nexport interface RadioGroupProps\n extends Omit<\n RadioGroupPrimitive.Props,\n \"children\" | \"defaultValue\" | \"onValueChange\" | \"render\" | \"value\"\n > {\n defaultValue?: string;\n descriptionClassName?: ClassValue;\n itemClassName?: ClassValue;\n items: RadioGroupItem[];\n labelClassName?: ClassValue;\n onValueChange?: (\n value: string,\n eventDetails: RadioGroupPrimitive.ChangeEventDetails\n ) => void;\n optionClassName?: ClassValue;\n value?: string;\n}\n\nexport const RadioGroup = ({\n items,\n optionClassName,\n itemClassName,\n labelClassName,\n descriptionClassName,\n className,\n ...rootProps\n}: RadioGroupProps) => {\n const baseId = useId();\n\n return (\n \n {items.map((item, index) => {\n // Derive ids from the index, not item.value: values may contain\n // whitespace, which would break the space-separated aria-labelledby /\n // aria-describedby token lists and drop the accessible name.\n const labelId = `${baseId}-${index}-label`;\n const descriptionId =\n item.description === undefined\n ? undefined\n : `${baseId}-${index}-description`;\n\n return (\n // biome-ignore lint/a11y/noLabelWithoutControl: the radio control is rendered inside.\n \n \n \n \n {item.label}\n \n {item.description !== undefined && (\n \n {item.description}\n \n )}\n \n \n );\n })}\n \n );\n};\n\nexport default RadioGroup;\n", "type": "registry:component", "target": "components/easy/radio-group.tsx" } ], "type": "registry:component" }