Skip to content

Radio

KRadio is a wrapper for native input type radio elements.

Selected: string
vue
<template>
  <div>Selected: {{ radioValue }}</div>
  <KRadio name="test" :selected-value="true" v-model="radioValue">Boolean</KRadio>
  <KRadio name="test" selected-value="string" v-model="radioValue">String</KRadio>
  <KRadio name="test" :selected-value="objA" v-model="radioValue">Object A</KRadio>
  <KRadio name="test" :selected-value="objB" v-model="radioValue">Object B</KRadio>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const radioValue = ref<boolean | string | object>('string')

const objA = { name: 'a' }
const objB = { name: 'b' }
</script>

Props

v-model

Use v-model to bind the checked state of the underlying <input> element. The v-model binds to the modelValue prop of the component and sets the current checked state of the input. You can read more about passing values via v-model here.

selectedValue

The value of the KRadio option that will be emitted by the change and update:modelValue events.

label

Will place label text to the right of the radio. Can also be slotted.

html
<KRadio v-model="checked" label="Label example" :selected-value="true" />

labelAttributes

KRadio has an instance of KLabel for supporting tooltip text. Use the labelAttributes prop to configure the KLabel's props. This example shows using the labelAttributes to set up a tooltip. Tooltip content can also be slotted.

html
<KRadio
  v-model="checked"
  label="Tooltip"
  :label-attributes="{ info: 'I use the KLabel `help` prop' }"
  :selected-value="true"
/>

description

Will place description text under the radio label. Can also be slotted.

Some description text

html
<KRadio
  v-model="radio"
  label="Label example"
  description="Some description text"
  :selected-value="true"
/>

error

Use this prop to apply error styling to the component.

Some description text

html
<KRadio
  v-model="radio"
  label="Input error"
  error
  description="Some description text"
  :selected-value="true"
/>

HTML attributes

Any valid attribute will be added to the input. You can read more about $attrs here.

html
<KRadio
  v-model="checked"
  :selected-value="true"
  disabled
>
  Disabled radio
</KRadio>

card

Set this prop to true to change the appearance of the KRadio component to a card-style design. When card is set to true, the KRadio component will be displayed with a card-like layout, providing a visually distinct and appealing presentation.

Selected: none
vue
<template>
  <KRadio
    v-model="cardRadio"
    description="Choose this option if you want your APIs to be publicly accessible by anyone on the internet."
    card
    label="Public"
    selected-value="public"
  >
    <WorldIcon />
  </KRadio>
  <KRadio
    v-model="cardRadio"
    description="Choose this option if you want your APIs to only be accessible from within your private network."
    card
    label="Private"
    selected-value="private"
  >
    <WorldPrivateIcon />
  </KRadio>
  <div>Selected: {{ cardRadio || 'none' }}</div>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const cardRadio = ref<string>('')
</script>

cardOrientation

Used alongside the card prop to set the orientation of the card layout.

Accepted values are vertical (shown above) or horizontal. Defaults to vertical.

html
<KRadio
  card-orientation="horizontal"
  v-model="cardRadio"
  description="Choose this option if you want your APIs to only be accessible from within your private network."
  card
  label="Private"
  selected-value="private"
>
  <KBadge appearance="success">
    Recommended
  </KBadge>
</KRadio>
<KRadio
  card-orientation="horizontal"
  v-model="cardRadio"
  description="Choose this option if you want your APIs to be publicly accessible by anyone on the internet."
  label="Public"
  card
  selected-value="public"
/>

cardRadioVisible

Prop to show or hide radio button in card. Default value is true.

Vertical:

Horizontal:

html
<KRadio
  :card-radio-visible="false"
  v-model="radioCard"
  card
  label="Vertical"
  description="Vertical radio card with hidden radio button."
  :selected-value="false"
/>
<KRadio
  :card-radio-visible="false"
  v-model="radioCard"
  card
  card-orientation="horizontal"
  label="Horizontal"
  description="Horizontal radio card with hidden radio button."
  :selected-value="true"
/>

Slots

default

Content passed in to the default slot will be shown as the label content. The slot content takes precedence over the label prop.

html
<KRadio
  v-model="checked"
  label="This will be replaced with a slot"
  :selected-value="true"
>
  Label goes here. The radio is {{ checked ? "selected" : "not selected" }}
</KRadio>

NOTE

To preserve a valid HTML structure, avoid slotting in block-level elements such as a div into the default slot as it will be rendered inside a label element. This also applies to card-style radio.

TIP

When card prop is true, the content passed to the default slot be will rendered:

  • directly above the label if cardOrientation prop is vertical
  • to the right of label and description of cardOrientation prop is horizontal

Should you want to customize the layout inside the card you can omit the label and description props and style content passed through the default slot yourself.

description

Content passed in to the description slot will be shown as the description content. The slot content takes precedence over the description prop.

Description goes here
html
<KRadio
  v-model="checked"
  label="Some label"
  description="This will be replaced with a slot"
  :selected-value="true"
>
  <template #description>Description goes here</template>
</KRadio>

tooltip

Provides a slot for tooltip content displayed after the radio label.

html
<KRadio v-model="checked" :selected-value="true">
  My tooltip
  <template #tooltip>Roses are <code>#FF0000</code>, violets are <code>#0000FF</code></template>
</KRadio>

Events

KRadio emits two events with same payload.

change

Fired on change, returns radio selectedValue.

update:modelValue

Fired on change, returns radio selectedValue.

Released under the Apache-2.0 License.