Skip to content

Checkbox ​

KCheckbox is a wrapper for native input type checkbox elements.

html
<KCheckbox
  v-model="checked"
  label="Check this out!"
/>

Props ​

v-model ​

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

html
<KCheckbox v-model="checked">
  {{ checked ? 'Checked!' : 'Unchecked' }}
</KCheckbox>

label ​

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

html
<KCheckbox
  v-model="checked"
  label="Label example"
/>

labelAttributes ​

KCheckbox 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, see the slot section if you want to slot HTML into the tooltip rather than use plain text.

html
<KCheckbox
  v-model="checked1"
  label="Tooltip"
  :label-attributes="{ info: 'I use the KLabel `info` prop' }"
/>

<KCheckbox
  v-model="checked2"
  label="Required"
  :label-attributes="{ required: true }"
/>

description ​

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

Some description text

html
<KCheckbox
  v-model="checked"
  label="Label example"
  description="Some description text"
/>

error ​

Use this prop to apply error styling to the component.

Some description text

html
<KCheckbox
 v-model="checked"
 label="Input error"
 error
 description="Some description text"
/>

HTML attributes ​

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

disabled ​

Whether or not KCheckbox is enabled.

html
<KCheckbox v-model="unchecked" label="Can't check this" disabled />
<KCheckbox v-model="checked" label="Can't uncheck this" disabled />

indeterminate ​

In addition to the checked and unchecked states, a KCheckbox can be in an indeterminate state. The indeterminate state is visual only. The checkbox is still either checked or unchecked as a state, but masks the real value of the checkbox.

vue
<template>
  <KCheckbox
    v-model="checkAll"
    :indeterminate="isIndeterminate"
    :label="checkAll ? 'Uncheck all' : 'Check all'"
    @change="handleIndeterminateChange"
  />
  <KCheckbox
    v-for="(value, index) in indeterminateValues"
    :key="index"
    v-model="value.value"
    :label="value.label"
  />
</template>

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

const checkAll = ref<boolean>(false)

const indeterminateValues = ref<Array<Record<string, any>>>([
  {
    label: 'Option 1',
    value: false,
  },
  {
    label: 'Option 2',
    value: true,
  },
  {
    label: 'Option 3',
    value: false,
  },
])

const isIndeterminate = computed((): boolean => {
  return !!indeterminateValues.value.filter((value) => value.value).length && !!indeterminateValues.value.filter((value) => !value.value).length
})

const handleIndeterminateChange = (value: boolean) => {
  indeterminateValues.value.forEach((val) => {
    val.value = value
  })
}

watch(indeterminateValues, () => {
  // all are selected
  if (indeterminateValues.value.filter((value) => value.value).length === indeterminateValues.value.length) {
    checkAll.value = true
  // all are unselected
  } else if (indeterminateValues.value.filter((value) => !value.value).length === indeterminateValues.value.length) {
    checkAll.value = false
  // some are selected
  } else {
    checkAll.value = false
  }
}, { deep: true })
</script>

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
<KCheckbox v-model="privacyPolicyConsent">
  I agree to the <a :href="privacyPolicyURL">privacy policy</a>.
</KCheckbox>

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.

description ​

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

Anything goes here
html
<KCheckbox
  v-model="checked"
  description="This will be replaced with a slot"
  label="Some label"
>
  <template #description>
    Anything goes here
  </template>
</KCheckbox>

tooltip ​

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

html
<KCheckbox v-model="checked">
  My tooltip
  <template #tooltip>Roses are <code>#FF0000</code>, violets are <code>#0000FF</code></template>
</KCheckbox>

Events ​

KCheckbox emits a few events with same data in payloads.

input ​

Fired on change, returns the checked status of the checkbox (boolean).

change ​

Fired on change, returns the checked status of the checkbox (boolean).

update:modelValue ​

Fired on change, returns the checked status of the checkbox (boolean).

Released under the Apache-2.0 License.