RadioGroup
Usage
Use the v-model directive to control the value of the RadioGroup or the default-value prop to set the initial value when you do not need to control its state.
Items
Use the items prop as an array of strings, numbers or booleans:
<script setup lang="ts">
const items = ref(['System', 'Light', 'Dark'])
const value = ref('System')
</script>
<template>
  <URadioGroup v-model="value" :items="items" />
</template>
You can also pass an array of objects with the following properties:
- label?: string
- description?: string
- value?: string
- disabled?: boolean
<script setup lang="ts">
const items = ref([
  {
    label: 'System',
    description: 'This is the first option.',
    value: 'system'
  },
  {
    label: 'Light',
    description: 'This is the second option.',
    value: 'light'
  },
  {
    label: 'Dark',
    description: 'This is the third option.',
    value: 'dark'
  }
])
const value = ref('system')
</script>
<template>
  <URadioGroup v-model="value" :items="items" />
</template>
value property of the object in the v-model directive or the default-value prop.Value Key
You can change the property that is used to set the value by using the value-key prop. Defaults to value.
<script setup lang="ts">
const items = ref([
  {
    label: 'System',
    description: 'This is the first option.',
    id: 'system'
  },
  {
    label: 'Light',
    description: 'This is the second option.',
    id: 'light'
  },
  {
    label: 'Dark',
    description: 'This is the third option.',
    id: 'dark'
  }
])
const value = ref('light')
</script>
<template>
  <URadioGroup v-model="value" value-key="id" :items="items" />
</template>
Legend
Use the legend prop to set the legend of the RadioGroup.
<script setup lang="ts">
const items = ref(['System', 'Light', 'Dark'])
</script>
<template>
  <URadioGroup legend="Theme" default-value="System" :items="items" />
</template>
Orientation
Use the orientation prop to change the orientation of the RadioGroup. Defaults to vertical.
<script setup lang="ts">
const items = ref(['System', 'Light', 'Dark'])
</script>
<template>
  <URadioGroup orientation="horizontal" default-value="System" :items="items" />
</template>
Color
Use the color prop to change the color of the RadioGroup.
<script setup lang="ts">
const items = ref(['System', 'Light', 'Dark'])
</script>
<template>
  <URadioGroup color="neutral" default-value="System" :items="items" />
</template>
Size
Use the size prop to change the size of the RadioGroup.
<script setup lang="ts">
const items = ref(['System', 'Light', 'Dark'])
</script>
<template>
  <URadioGroup size="xl" default-value="System" :items="items" />
</template>
Disabled
Use the disabled prop to disable the RadioGroup.
<script setup lang="ts">
const items = ref(['System', 'Light', 'Dark'])
</script>
<template>
  <URadioGroup disabled default-value="System" :items="items" />
</template>
API
Props
| Prop | Default | Type | 
|---|---|---|
| as | 
 | 
 The element or component this component should render as. | 
| legend | 
 | |
| valueKey | 
 | 
 When  | 
| labelKey | 
 | 
 When  | 
| descriptionKey | 
 | 
 When  | 
| items | 
 | |
| size | 
 | 
 | 
| color | 
 | 
 | 
| orientation | 
 | 
 The orientation the radio buttons are laid out. | 
| defaultValue | 
 The value of the radio item that should be checked when initially rendered. Use when you do not need to control the state of the radio items. | |
| modelValue | 
 The controlled value of the radio item to check. Can be binded as  | |
| disabled | 
 When  | |
| loop | 
 When  | |
| required | 
 When  | |
| name | 
 The name of the group. Submitted with its owning form as part of a name/value pair. | |
| ui | 
 | 
Slots
| Slot | Type | 
|---|---|
| legend | 
 | 
| label | 
 | 
| description | 
 | 
Emits
| Event | Type | 
|---|---|
| change | 
 | 
| update:modelValue | 
 | 
Theme
export default defineAppConfig({
  ui: {
    radioGroup: {
      slots: {
        root: 'relative',
        fieldset: 'flex',
        legend: 'mb-1 block font-medium text-[var(--ui-text)]',
        item: 'flex items-start',
        base: 'rounded-full ring ring-inset ring-[var(--ui-border-accented)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-offset-[var(--ui-bg)]',
        indicator: 'flex items-center justify-center size-full rounded-full after:bg-[var(--ui-bg)] after:rounded-full',
        container: 'flex items-center',
        wrapper: 'ms-2',
        label: 'block font-medium text-[var(--ui-text)]',
        description: 'text-[var(--ui-text-muted)]'
      },
      variants: {
        color: {
          primary: {
            base: 'focus-visible:outline-[var(--ui-primary)]',
            indicator: 'bg-[var(--ui-primary)]'
          },
          secondary: {
            base: 'focus-visible:outline-[var(--ui-secondary)]',
            indicator: 'bg-[var(--ui-secondary)]'
          },
          success: {
            base: 'focus-visible:outline-[var(--ui-success)]',
            indicator: 'bg-[var(--ui-success)]'
          },
          info: {
            base: 'focus-visible:outline-[var(--ui-info)]',
            indicator: 'bg-[var(--ui-info)]'
          },
          warning: {
            base: 'focus-visible:outline-[var(--ui-warning)]',
            indicator: 'bg-[var(--ui-warning)]'
          },
          error: {
            base: 'focus-visible:outline-[var(--ui-error)]',
            indicator: 'bg-[var(--ui-error)]'
          },
          neutral: {
            base: 'focus-visible:outline-[var(--ui-border-inverted)]',
            indicator: 'bg-[var(--ui-bg-inverted)]'
          }
        },
        orientation: {
          horizontal: {
            fieldset: 'flex-row',
            wrapper: 'me-2'
          },
          vertical: {
            fieldset: 'flex-col'
          }
        },
        size: {
          xs: {
            fieldset: 'gap-0.5',
            legend: 'text-xs',
            base: 'size-3',
            item: 'text-xs',
            container: 'h-4',
            indicator: 'after:size-1'
          },
          sm: {
            fieldset: 'gap-0.5',
            legend: 'text-xs',
            base: 'size-3.5',
            item: 'text-xs',
            container: 'h-4',
            indicator: 'after:size-1'
          },
          md: {
            fieldset: 'gap-1',
            legend: 'text-sm',
            base: 'size-4',
            item: 'text-sm',
            container: 'h-5',
            indicator: 'after:size-1.5'
          },
          lg: {
            fieldset: 'gap-1',
            legend: 'text-sm',
            base: 'size-4.5',
            item: 'text-sm',
            container: 'h-5',
            indicator: 'after:size-1.5'
          },
          xl: {
            fieldset: 'gap-1.5',
            legend: 'text-base',
            base: 'size-5',
            item: 'text-base',
            container: 'h-6',
            indicator: 'after:size-2'
          }
        },
        disabled: {
          true: {
            base: 'cursor-not-allowed opacity-75',
            label: 'cursor-not-allowed opacity-75'
          }
        },
        required: {
          true: {
            legend: "after:content-['*'] after:ms-0.5 after:text-[var(--ui-error)]"
          }
        }
      },
      defaultVariants: {
        size: 'md',
        color: 'primary'
      }
    }
  }
})