{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "primitives-radix-radio-group",
  "title": "Radix Radio Group",
  "description": "A set of checkable buttons—known as radio buttons—where no more than one of the buttons can be checked at a time.",
  "dependencies": [
    "motion",
    "radix-ui"
  ],
  "registryDependencies": [
    "@odysseyui/lib-get-strict-context",
    "@odysseyui/hooks-use-controlled-state"
  ],
  "files": [
    {
      "path": "registry/primitives/radix/radio-group/index.tsx",
      "content": "'use client';\n\nimport * as React from 'react';\nimport { RadioGroup as RadioGroupPrimitive } from 'radix-ui';\nimport { AnimatePresence, motion, type HTMLMotionProps } from 'motion/react';\n\nimport { getStrictContext } from '@/lib/get-strict-context';\nimport { useControlledState } from '@/hooks/use-controlled-state';\n\ntype RadioGroupContextType = {\n  value: string;\n  setValue: (value: string) => void;\n};\n\ntype RadioGroupItemContextType = {\n  isChecked: boolean;\n  setIsChecked: (isChecked: boolean) => void;\n};\n\nconst [RadioGroupProvider, useRadioGroup] =\n  getStrictContext<RadioGroupContextType>('RadioGroupContext');\n\nconst [RadioGroupItemProvider, useRadioGroupItem] =\n  getStrictContext<RadioGroupItemContextType>('RadioGroupItemContext');\n\ntype RadioGroupProps = React.ComponentProps<typeof RadioGroupPrimitive.Root>;\n\nfunction RadioGroup(props: RadioGroupProps) {\n  const [value, setValue] = useControlledState({\n    value: props.value ?? undefined,\n    defaultValue: props.defaultValue,\n    onChange: props.onValueChange,\n  });\n\n  return (\n    <RadioGroupProvider value={{ value, setValue }}>\n      <RadioGroupPrimitive.Root\n        data-slot=\"radio-group\"\n        {...props}\n        onValueChange={setValue}\n      />\n    </RadioGroupProvider>\n  );\n}\n\ntype RadioGroupIndicatorProps = Omit<\n  React.ComponentProps<typeof RadioGroupPrimitive.Indicator>,\n  'asChild' | 'forceMount'\n> &\n  HTMLMotionProps<'div'>;\n\nfunction RadioGroupIndicator({\n  transition = { type: 'spring', stiffness: 200, damping: 16 },\n  ...props\n}: RadioGroupIndicatorProps) {\n  const { isChecked } = useRadioGroupItem();\n\n  return (\n    <AnimatePresence>\n      {isChecked && (\n        <RadioGroupPrimitive.Indicator\n          data-slot=\"radio-group-indicator\"\n          asChild\n          forceMount\n        >\n          <motion.div\n            key=\"radio-group-indicator-circle\"\n            data-slot=\"radio-group-indicator-circle\"\n            initial={{ opacity: 0, scale: 0 }}\n            animate={{ opacity: 1, scale: 1 }}\n            exit={{ opacity: 0, scale: 0 }}\n            transition={transition}\n            {...props}\n          />\n        </RadioGroupPrimitive.Indicator>\n      )}\n    </AnimatePresence>\n  );\n}\n\ntype RadioGroupItemProps = Omit<\n  React.ComponentProps<typeof RadioGroupPrimitive.Item>,\n  'asChild'\n> &\n  HTMLMotionProps<'button'>;\n\nfunction RadioGroupItem({\n  value: valueProps,\n  disabled,\n  required,\n  ...props\n}: RadioGroupItemProps) {\n  const { value } = useRadioGroup();\n  const [isChecked, setIsChecked] = React.useState(value === valueProps);\n\n  React.useEffect(() => {\n    setIsChecked(value === valueProps);\n  }, [value, valueProps]);\n\n  return (\n    <RadioGroupItemProvider value={{ isChecked, setIsChecked }}>\n      <RadioGroupPrimitive.Item\n        asChild\n        value={valueProps}\n        disabled={disabled}\n        required={required}\n      >\n        <motion.button\n          data-slot=\"radio-group-item\"\n          whileHover={{ scale: 1.05 }}\n          whileTap={{ scale: 0.95 }}\n          {...props}\n        />\n      </RadioGroupPrimitive.Item>\n    </RadioGroupItemProvider>\n  );\n}\n\nexport {\n  RadioGroup,\n  RadioGroupItem,\n  RadioGroupIndicator,\n  useRadioGroup,\n  useRadioGroupItem,\n  type RadioGroupProps,\n  type RadioGroupItemProps,\n  type RadioGroupIndicatorProps,\n  type RadioGroupContextType,\n  type RadioGroupItemContextType,\n};\n",
      "type": "registry:ui",
      "target": "components/odysseyui/primitives/radix/radio-group.tsx"
    }
  ],
  "type": "registry:ui"
}