Checkbox
A control that allows the user to toggle between checked and not checked.
Features
- Supports indeterminate state.
- Full keyboard navigation.
- Can be controlled or uncontrolled.
- Supports custom true/false values.
Installation
Install the component from your command line.
sh
$ npm add reka-uiAnatomy
Import all parts and piece them together.
vue
<script setup>
import { CheckboxGroupRoot, CheckboxIndicator, CheckboxRoot } from 'reka-ui'
</script>
<template>
<CheckboxRoot>
<CheckboxIndicator />
</CheckboxRoot>
<!-- or with array support -->
<CheckboxGroupRoot>
<CheckboxRoot>
<CheckboxIndicator />
</CheckboxRoot>
</CheckboxGroupRoot>
</template>API Reference
Root
Contains all the parts of a checkbox. An input will also render when used within a form to ensure events propagate correctly.
| Data Attribute | Value |
|---|---|
[data-state] | "checked" | "unchecked" | "indeterminate" |
[data-disabled] | Present when disabled |
Indicator
Renders when the checkbox is in a checked or indeterminate state. You can style this element directly, or you can use it as a wrapper to put an icon into, or both.
tip
Built with Presence component - supports any animation techniques while maintaining access to presence emitted events. | Data Attribute | Value |
|---|---|
[data-state] | "checked" | "unchecked" | "indeterminate" |
[data-disabled] | Present when disabled |
Group Root
Wrapper around CheckboxRoot to support array of modelValue
Examples
Custom Values
Use the trueValue and falseValue props to specify custom values for the checked and unchecked states instead of the default true/false.
vue
<script setup>
import { Icon } from '@iconify/vue'
import { CheckboxIndicator, CheckboxRoot } from 'reka-ui'
import { ref } from 'vue'
// With string values
const acceptTerms = ref('no')
// With number values
const permission = ref(0)
</script>
<template>
<!-- String values -->
<CheckboxRoot v-model="acceptTerms" true-value="yes" false-value="no">
<CheckboxIndicator>
<Icon icon="radix-icons:check" />
</CheckboxIndicator>
</CheckboxRoot>
<span>Value: {{ acceptTerms }}</span> <!-- "yes" or "no" -->
<!-- Number values -->
<CheckboxRoot v-model="permission" :true-value="1" :false-value="0">
<CheckboxIndicator>
<Icon icon="radix-icons:check" />
</CheckboxIndicator>
</CheckboxRoot>
<span>Value: {{ permission }}</span> <!-- 1 or 0 -->
</template>Indeterminate
You can set the checkbox to indeterminate by taking control of its state.
vue
<script setup>
import { Icon } from '@iconify/vue'
import { CheckboxIndicator, CheckboxRoot } from 'reka-ui'
const checked = ref('indeterminate')
</script>
<template>
<CheckboxRoot v-model="checked">
<CheckboxIndicator>
<Icon
v-if="checked === 'indeterminate'"
icon="radix-icons:divider-horizontal"
/>
<Icon
v-if="checked"
icon="radix-icons:check"
/>
</CheckboxIndicator>
</CheckboxRoot>
<button
type="button"
@click="() => (checked === 'indeterminate' ? (checked = false) : (checked = 'indeterminate'))"
>
Toggle indeterminate
</button>
</template>Accessibility
Adheres to the tri-state Checkbox WAI-ARIA design pattern.
Keyboard Interactions
| Key | Description |
|---|---|
Space | Checks/unchecks the checkbox |
