Skip to content

Radio Button

Radio buttons allow users to select one option from a set of mutually exclusive choices. SageUI provides various radio button styles and states.

Basic Usage

Basic Radio Buttons
html
<!-- Basic radio -->
<input type="radio" name="radio-1" class="radio">

<!-- Radio group with labels -->
<div class="form-control">
  <label class="cursor-pointer label">
    <span class="label-text">Option 1</span> 
    <input type="radio" name="radio-group" class="radio" value="1">
  </label>
  <label class="cursor-pointer label">
    <span class="label-text">Option 2</span> 
    <input type="radio" name="radio-group" class="radio" value="2">
  </label>
</div>
Radio Group with Labels
html
  <div class="demo-title">Radio Group with Labels</div>
  <div class="form-control">
    <label class="cursor-pointer label">
      <span class="label-text">Option 1</span> 
      <input type="radio" name="radio-group-demo" class="radio" value="1" checked>
    </label>
    <label class="cursor-pointer label">
      <span class="label-text">Option 2</span> 
      <input type="radio" name="radio-group-demo" class="radio" value="2">
    </label>
  </div>

Variants

Sizes

Radio Sizes
html
<!-- Extra small -->
<input type="radio" name="size-xs" class="radio radio-xs" checked>

<!-- Small -->
<input type="radio" name="size-sm" class="radio radio-sm" checked>

<!-- Medium (default) -->
<input type="radio" name="size-md" class="radio" checked>

<!-- Large -->
<input type="radio" name="size-lg" class="radio radio-lg" checked>

Colors

Radio Colors
html
<!-- Primary -->
<input type="radio" name="color-primary" class="radio radio-primary" checked>

<!-- Secondary -->
<input type="radio" name="color-secondary" class="radio radio-secondary" checked>

<!-- Success -->
<input type="radio" name="color-success" class="radio radio-success" checked>

<!-- Warning -->
<input type="radio" name="color-warning" class="radio radio-warning" checked>

<!-- Error -->
<input type="radio" name="color-error" class="radio radio-error" checked>

States

Radio States
html
<!-- Selected -->
<input type="radio" name="state-selected" class="radio" checked>

<!-- Disabled -->
<input type="radio" name="state-disabled" class="radio" disabled>

<!-- Disabled and selected -->
<input type="radio" name="state-disabled-selected" class="radio" disabled checked>

Radio Button Groups

Horizontal Layout

Horizontal Radio Group
html
<div class="form-control">
  <label class="label">
    <span class="label-text">Choose your plan:</span>
  </label>
  
  <div class="flex gap-6">
    <label class="cursor-pointer label">
      <input type="radio" name="plan" class="radio radio-primary" value="basic">
      <span class="label-text ml-2">Basic</span>
    </label>
    
    <label class="cursor-pointer label">
      <input type="radio" name="plan" class="radio radio-primary" value="pro" checked>
      <span class="label-text ml-2">Pro</span>
    </label>
    
    <label class="cursor-pointer label">
      <input type="radio" name="plan" class="radio radio-primary" value="enterprise">
      <span class="label-text ml-2">Enterprise</span>
    </label>
  </div>
</div>

Vertical Layout

Vertical Radio Group
html
<div class="form-control">
  <label class="label">
    <span class="label-text">Preferred contact method:</span>
  </label>
  
  <div class="space-y-2">
    <label class="cursor-pointer label justify-start gap-2">
      <input type="radio" name="contact" class="radio radio-success" value="email" checked>
      <span class="label-text">Email</span>
    </label>
    
    <label class="cursor-pointer label justify-start gap-2">
      <input type="radio" name="contact" class="radio radio-success" value="phone">
      <span class="label-text">Phone</span>
    </label>
    
    <label class="cursor-pointer label justify-start gap-2">
      <input type="radio" name="contact" class="radio radio-success" value="sms">
      <span class="label-text">SMS</span>
    </label>
  </div>
</div>

Card-style Options

Card-style Radio Options
html
<div class="form-control">
  <label class="label">
    <span class="label-text">Select shipping method:</span>
  </label>
  
  <div class="grid grid-cols-1 gap-3">
    <label class="cursor-pointer">
      <input type="radio" name="shipping" class="radio radio-primary sr-only" value="standard" checked>
      <div class="card bg-base-100 border-2 border-primary shadow-sm hover:shadow-md transition-shadow">
        <div class="card-body p-4">
          <div class="flex items-center gap-3">
            <div class="radio radio-primary checked:opacity-100 opacity-60"></div>
            <div>
              <h3 class="font-semibold">Standard Shipping</h3>
              <p class="text-sm text-base-content/70">5-7 business days • Free</p>
            </div>
          </div>
        </div>
      </div>
    </label>
    
    <label class="cursor-pointer">
      <input type="radio" name="shipping" class="radio radio-primary sr-only" value="express">
      <div class="card bg-base-100 border-2 border-base-300 shadow-sm hover:shadow-md transition-shadow">
        <div class="card-body p-4">
          <div class="flex items-center gap-3">
            <div class="radio radio-primary opacity-60"></div>
            <div>
              <h3 class="font-semibold">Express Shipping</h3>
              <p class="text-sm text-base-content/70">2-3 business days • $15.99</p>
            </div>
          </div>
        </div>
      </div>
    </label>
  </div>
</div>

TypeScript Usage

typescript
import { Radio } from 'sageui';

// Create a radio group instance
const radioGroup = new Radio({
  name: 'my-radio-group',
  options: [
    { label: 'Option 1', value: '1' },
    { label: 'Option 2', value: '2' },
    { label: 'Option 3', value: '3' }
  ],
  variant: 'primary',
  size: 'md',
  value: '1'
});

// Render to container
radioGroup.render(document.getElementById('radio-container'));

// Update properties
radioGroup.setVariant('success');
radioGroup.setSize('lg');
radioGroup.setValue('2');

// Event handling
radioGroup.onChange((value) => {
  console.log('Selected value:', value);
});

// Get current selection
console.log('Current value:', radioGroup.getValue());
console.log('Selected option:', radioGroup.getSelectedOption());

Accessibility

  • Always use the same name attribute for radio buttons in the same group
  • Provide labels for all radio buttons using <label> elements
  • Use fieldset and legend for radio button groups
  • Ensure sufficient color contrast for all states
  • Support keyboard navigation (Arrow keys to move between options, Space to select)
  • Use aria-describedby for additional help text
  • Consider using role="radiogroup" for custom radio implementations

CSS Classes

ClassDescription
radioBase radio button styles
radio-xsExtra small size
radio-smSmall size
radio-lgLarge size
radio-primaryPrimary color variant
radio-secondarySecondary color variant
radio-successSuccess color variant
radio-warningWarning color variant
radio-errorError color variant

Examples

Survey Question

How satisfied are you with our service?

html
<div class="card w-full max-w-lg bg-base-100 shadow-xl">
  <div class="card-body">
    <h2 class="card-title">How satisfied are you with our service?</h2>
    
    <div class="form-control">
      <div class="space-y-3 mt-4">
        <label class="cursor-pointer label justify-start gap-3">
          <input type="radio" name="satisfaction" class="radio radio-error" value="1">
          <span class="label-text">Very Dissatisfied</span>
        </label>
        
        <label class="cursor-pointer label justify-start gap-3">
          <input type="radio" name="satisfaction" class="radio radio-warning" value="2">
          <span class="label-text">Dissatisfied</span>
        </label>
        
        <label class="cursor-pointer label justify-start gap-3">
          <input type="radio" name="satisfaction" class="radio radio-secondary" value="3">
          <span class="label-text">Neutral</span>
        </label>
        
        <label class="cursor-pointer label justify-start gap-3">
          <input type="radio" name="satisfaction" class="radio radio-primary" value="4">
          <span class="label-text">Satisfied</span>
        </label>
        
        <label class="cursor-pointer label justify-start gap-3">
          <input type="radio" name="satisfaction" class="radio radio-success" value="5">
          <span class="label-text">Very Satisfied</span>
        </label>
      </div>
    </div>
    
    <div class="card-actions justify-end mt-6">
      <button class="btn btn-primary">Submit</button>
    </div>
  </div>
</div>

Payment Method Selection

Payment Method
html
<fieldset class="form-control">
  <legend class="label">
    <span class="label-text text-lg font-semibold">Payment Method</span>
  </legend>
  
  <div class="grid grid-cols-1 gap-2 mt-4">
    <label class="cursor-pointer p-3 rounded-lg border border-base-300 hover:border-primary transition-colors">
      <div class="flex items-center justify-between">
        <div class="flex items-center gap-3">
          <input type="radio" name="payment" class="radio radio-primary" value="card" checked>
          <span class="font-medium">Credit/Debit Card</span>
        </div>
        <div class="flex gap-1">
          <svg class="w-8 h-5" viewBox="0 0 48 30" fill="none">
            <!-- Visa/Mastercard icons -->
          </svg>
        </div>
      </div>
    </label>
    
    <label class="cursor-pointer p-3 rounded-lg border border-base-300 hover:border-primary transition-colors">
      <div class="flex items-center justify-between">
        <div class="flex items-center gap-3">
          <input type="radio" name="payment" class="radio radio-primary" value="paypal">
          <span class="font-medium">PayPal</span>
        </div>
        <div class="text-blue-600 font-bold">PayPal</div>
      </div>
    </label>
    
    <label class="cursor-pointer p-3 rounded-lg border border-base-300 hover:border-primary transition-colors">
      <div class="flex items-center gap-3">
        <input type="radio" name="payment" class="radio radio-primary" value="bank">
        <span class="font-medium">Bank Transfer</span>
      </div>
    </label>
  </div>
</fieldset>

Released under the MIT License.