Agents (llms.txt)
Octocat

Radio

A radio button input component.

import { Radio } from '@/components/radio';

const labelClass = 'font-medium text-base text-foreground';

export default function RadioPreview() {
  return (
    <div className="flex flex-col gap-4">
      <div className="space-y-2">
        <div className="flex items-center gap-2">
          <Radio id="option1" name="options" />
          <label className={labelClass} htmlFor="option1">
            Option 1
          </label>
        </div>
        <div className="flex items-center gap-2">
          <Radio id="option2" name="options" />
          <label className={labelClass} htmlFor="option2">
            Option 2
          </label>
        </div>
        <div className="flex items-center gap-2">
          <Radio id="option3" name="options" />
          <label className={labelClass} htmlFor="option3">
            Option 3
          </label>
        </div>
      </div>

      <div className="space-y-2">
        <div className="flex items-center gap-2">
          <Radio id="disabled" disabled />
          <label className={labelClass} htmlFor="disabled">
            Disabled
          </label>
        </div>
        <div className="flex items-center gap-2">
          <Radio id="checked-disabled" disabled defaultChecked />
          <label className={labelClass} htmlFor="checked-disabled">
            Checked & Disabled
          </label>
        </div>
      </div>
    </div>
  );
}

Source Code

import { cva } from '@/lib/utils/classnames';

const radioStyle = cva({
  base: [
    'focus-visible:ring-(length:--ring-width) relative flex size-5 shrink-0 appearance-none items-center justify-center rounded-full border border-border bg-background shadow-xs outline-none ring-ring transition enabled:cursor-pointer enabled:not-checked:hover:border-mix-border/8',
    // checked
    'checked:enabled:hover:mix-with-accent-foreground checked:enabled:border-accent checked:enabled:bg-accent checked:enabled:hover:border-mix-accent/8',
    // checked circle
    'checked:before:absolute checked:before:h-1.5 checked:before:w-1.5 checked:before:rounded-full checked:before:bg-accent-foreground',
    // disabled
    'disabled:cursor-not-allowed disabled:border-foreground/5 disabled:bg-foreground/10 disabled:checked:before:bg-foreground/50',
  ],
});

const Radio = ({
  className,
  ...props
}: Omit<React.ComponentPropsWithRef<'input'>, 'type'>) => {
  return (
    <input type="radio" className={radioStyle({ className })} {...props} />
  );
};

export { Radio };

API Reference

Extends the input element with type="radio".

Examples

Simple

Basic usage of radio buttons.

import { Radio } from '@/components/radio';

const labelClass = 'font-medium text-base text-foreground';

export default function RadioPreview() {
  return (
    <div className="flex flex-col gap-4">
      <div className="space-y-2">
        <div className="flex items-center gap-2">
          <Radio id="option1" name="options" />
          <label className={labelClass} htmlFor="option1">
            Option 1
          </label>
        </div>
        <div className="flex items-center gap-2">
          <Radio id="option2" name="options" />
          <label className={labelClass} htmlFor="option2">
            Option 2
          </label>
        </div>
        <div className="flex items-center gap-2">
          <Radio id="option3" name="options" />
          <label className={labelClass} htmlFor="option3">
            Option 3
          </label>
        </div>
      </div>

      <div className="space-y-2">
        <div className="flex items-center gap-2">
          <Radio id="disabled" disabled />
          <label className={labelClass} htmlFor="disabled">
            Disabled
          </label>
        </div>
        <div className="flex items-center gap-2">
          <Radio id="checked-disabled" disabled defaultChecked />
          <label className={labelClass} htmlFor="checked-disabled">
            Checked & Disabled
          </label>
        </div>
      </div>
    </div>
  );
}

Best Practices

  1. Labels:

    • Use clear, concise labels
    • Make labels clickable
    • Consider label position
  2. Accessibility:

    • Ensure keyboard navigation
    • Use fieldset and legend for groups
    • Maintain sufficient spacing between options

Previous

Progress

Next

Segmented Control