Base Radio

PreviousNext

An easily stylable radio button component.

Docs
animate-uiui

Preview

Loading preview…
registry/components/base/radio/index.tsx
import * as React from 'react';
import { CircleIcon } from 'lucide-react';

import {
  RadioGroup as RadioGroupPrimitive,
  Radio as RadioPrimitive,
  RadioIndicator as RadioIndicatorPrimitive,
  type RadioGroupProps as RadioGroupPrimitiveProps,
  type RadioProps as RadioPrimitiveProps,
} from '@/components/animate-ui/primitives/base/radio';
import { cn } from '@/lib/utils';

type RadioGroupProps = RadioGroupPrimitiveProps;

function RadioGroup({ className, ...props }: RadioGroupProps) {
  return (
    <RadioGroupPrimitive className={cn('grid gap-3', className)} {...props} />
  );
}

type RadioProps = RadioPrimitiveProps;

function Radio({ className, ...props }: RadioProps) {
  return (
    <RadioPrimitive
      className={cn(
        'border-input text-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 aspect-square size-4 shrink-0 rounded-full border shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50',
        className,
      )}
      {...props}
    >
      <RadioIndicatorPrimitive className="relative flex items-center justify-center">
        <CircleIcon className="fill-primary absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2" />
      </RadioIndicatorPrimitive>
    </RadioPrimitive>
  );
}

export { RadioGroup, Radio, type RadioGroupProps, type RadioProps };

Installation

npx shadcn@latest add @animate-ui/components-base-radio

Usage

import { ComponentsBaseRadio } from "@/components/ui/components-base-radio"
<ComponentsBaseRadio />