CheckboxGroup
Usage
Use the v-model directive to control the value of the CheckboxGroup or the default-value prop to set the initial value when you do not need to control its state.
<script setup lang="ts">
const items = ref(['System', 'Light', 'Dark'])
const value = ref(['System'])
</script>
<template>
<UCheckboxGroup v-model="value" :items="items" />
</template>
<script setup lang="ts">
import { ref } from 'vue'
const items = ref(['System', 'Light', 'Dark'])
const value = ref(['System'])
</script>
<template>
<UCheckboxGroup v-model="value" :items="items" />
</template>
Items
Use the items prop as an array of strings or numbers:
<script setup lang="ts">
const items = ref(['System', 'Light', 'Dark'])
const value = ref(['System'])
</script>
<template>
<UCheckboxGroup v-model="value" :items="items" />
</template>
<script setup lang="ts">
import { ref } from 'vue'
const items = ref(['System', 'Light', 'Dark'])
const value = ref(['System'])
</script>
<template>
<UCheckboxGroup v-model="value" :items="items" />
</template>
You can also pass an array of objects with the following properties:
label?: stringdescription?: stringvalue?: stringdisabled?: booleanicon?: stringclass?: anyui?: { item?: ClassNameValue, container?: ClassNameValue, base?: ClassNameValue, 'indicator'?: ClassNameValue, icon?: ClassNameValue, wrapper?: ClassNameValue, label?: ClassNameValue, description?: ClassNameValue }
<script setup lang="ts">
import type { CheckboxGroupItem } from '@nuxt/ui'
const items = ref<CheckboxGroupItem[]>([
{
label: 'System',
description: 'Matches your device settings.',
value: 'system'
},
{
label: 'Light',
description: 'Always uses the light theme.',
value: 'light'
},
{
label: 'Dark',
description: 'Always uses the dark theme.',
value: 'dark'
}
])
const value = ref([
'system'
])
</script>
<template>
<UCheckboxGroup v-model="value" :items="items" />
</template>
<script setup lang="ts">
import { ref } from 'vue'
import type { CheckboxGroupItem } from '@nuxt/ui'
const items = ref<CheckboxGroupItem[]>([
{
label: 'System',
description: 'Matches your device settings.',
value: 'system'
},
{
label: 'Light',
description: 'Always uses the light theme.',
value: 'light'
},
{
label: 'Dark',
description: 'Always uses the dark theme.',
value: 'dark'
}
])
const value = ref([
'system'
])
</script>
<template>
<UCheckboxGroup 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">
import type { CheckboxGroupItem } from '@nuxt/ui'
const items = ref<CheckboxGroupItem[]>([
{
label: 'System',
description: 'Matches your device settings.',
id: 'system'
},
{
label: 'Light',
description: 'Always uses the light theme.',
id: 'light'
},
{
label: 'Dark',
description: 'Always uses the dark theme.',
id: 'dark'
}
])
const value = ref([
'light'
])
</script>
<template>
<UCheckboxGroup v-model="value" value-key="id" :items="items" />
</template>
<script setup lang="ts">
import { ref } from 'vue'
import type { CheckboxGroupItem } from '@nuxt/ui'
const items = ref<CheckboxGroupItem[]>([
{
label: 'System',
description: 'Matches your device settings.',
id: 'system'
},
{
label: 'Light',
description: 'Always uses the light theme.',
id: 'light'
},
{
label: 'Dark',
description: 'Always uses the dark theme.',
id: 'dark'
}
])
const value = ref([
'light'
])
</script>
<template>
<UCheckboxGroup v-model="value" value-key="id" :items="items" />
</template>
Legend
Use the legend prop to set the legend of the CheckboxGroup.
<script setup lang="ts">
const items = ref(['System', 'Light', 'Dark'])
</script>
<template>
<UCheckboxGroup legend="Theme" :default-value="['System']" :items="items" />
</template>
<script setup lang="ts">
import { ref } from 'vue'
const items = ref(['System', 'Light', 'Dark'])
</script>
<template>
<UCheckboxGroup legend="Theme" :default-value="['System']" :items="items" />
</template>
Color
Use the color prop to change the color of the CheckboxGroup.
<script setup lang="ts">
const items = ref(['System', 'Light', 'Dark'])
</script>
<template>
<UCheckboxGroup color="neutral" :default-value="['System']" :items="items" />
</template>
<script setup lang="ts">
import { ref } from 'vue'
const items = ref(['System', 'Light', 'Dark'])
</script>
<template>
<UCheckboxGroup color="neutral" :default-value="['System']" :items="items" />
</template>
Variant
Use the variant prop to change the variant of the CheckboxGroup.
<script setup lang="ts">
import type { CheckboxGroupItem } from '@nuxt/ui'
const items = ref<CheckboxGroupItem[]>([
{
label: 'System',
value: 'system',
description: 'Matches your device settings.'
},
{
label: 'Light',
value: 'light',
description: 'Always uses the light theme.'
},
{
label: 'Dark',
value: 'dark',
description: 'Always uses the dark theme.'
}
])
</script>
<template>
<UCheckboxGroup color="primary" variant="card" :default-value="['system']" :items="items" />
</template>
<script setup lang="ts">
import { ref } from 'vue'
import type { CheckboxGroupItem } from '@nuxt/ui'
const items = ref<CheckboxGroupItem[]>([
{
label: 'System',
value: 'system',
description: 'Matches your device settings.'
},
{
label: 'Light',
value: 'light',
description: 'Always uses the light theme.'
},
{
label: 'Dark',
value: 'dark',
description: 'Always uses the dark theme.'
}
])
</script>
<template>
<UCheckboxGroup color="primary" variant="card" :default-value="['system']" :items="items" />
</template>
Size
Use the size prop to change the size of the CheckboxGroup.
<script setup lang="ts">
const items = ref(['System', 'Light', 'Dark'])
</script>
<template>
<UCheckboxGroup size="xl" variant="list" :default-value="['System']" :items="items" />
</template>
<script setup lang="ts">
import { ref } from 'vue'
const items = ref(['System', 'Light', 'Dark'])
</script>
<template>
<UCheckboxGroup size="xl" variant="list" :default-value="['System']" :items="items" />
</template>
Orientation
Use the orientation prop to change the orientation of the CheckboxGroup. Defaults to vertical.
<script setup lang="ts">
const items = ref(['System', 'Light', 'Dark'])
</script>
<template>
<UCheckboxGroup
orientation="horizontal"
variant="list"
:default-value="['System']"
:items="items"
/>
</template>
<script setup lang="ts">
import { ref } from 'vue'
const items = ref(['System', 'Light', 'Dark'])
</script>
<template>
<UCheckboxGroup
orientation="horizontal"
variant="list"
:default-value="['System']"
:items="items"
/>
</template>
Indicator
Use the indicator prop to change the position or hide the indicator. Defaults to start.
icon replaces the check mark while the indicator is visible, and is displayed above the label when it is hidden.<script setup lang="ts">
import type { CheckboxGroupItem } from '@nuxt/ui'
const items = ref<CheckboxGroupItem[]>([
{
label: 'System',
icon: 'i-lucide-monitor',
value: 'System',
class: 'w-20'
},
{
label: 'Light',
icon: 'i-lucide-sun',
class: 'w-20',
value: 'Light'
},
{
label: 'Dark',
icon: 'i-lucide-moon',
class: 'w-20',
value: 'Dark'
}
])
</script>
<template>
<UCheckboxGroup
indicator="hidden"
orientation="horizontal"
variant="table"
:default-value="['System']"
:items="items"
/>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import type { CheckboxGroupItem } from '@nuxt/ui'
const items = ref<CheckboxGroupItem[]>([
{
label: 'System',
icon: 'i-lucide-monitor',
value: 'System',
class: 'w-20'
},
{
label: 'Light',
icon: 'i-lucide-sun',
class: 'w-20',
value: 'Light'
},
{
label: 'Dark',
icon: 'i-lucide-moon',
class: 'w-20',
value: 'Dark'
}
])
</script>
<template>
<UCheckboxGroup
indicator="hidden"
orientation="horizontal"
variant="table"
:default-value="['System']"
:items="items"
/>
</template>
Disabled
Use the disabled prop to disable the CheckboxGroup.
<script setup lang="ts">
const items = ref(['System', 'Light', 'Dark'])
</script>
<template>
<UCheckboxGroup disabled :default-value="['System']" :items="items" />
</template>
<script setup lang="ts">
import { ref } from 'vue'
const items = ref(['System', 'Light', 'Dark'])
</script>
<template>
<UCheckboxGroup disabled :default-value="['System']" :items="items" />
</template>
API
Props
| Prop | Default | Type |
|---|---|---|
as | 'div' | anyThe element or component this component should render as. |
legend | string | |
valueKey | 'value' | VKWhen |
labelKey | 'label' | keyof Extract<NestedItem<T>, object> & string | DotPathKeys<Extract<NestedItem<T>, object>>When |
descriptionKey | 'description' | keyof Extract<NestedItem<T>, object> & string | DotPathKeys<Extract<NestedItem<T>, object>>When |
items | T | |
modelValue | GetItemValue<T, VK, undefined, NestedItem<T>>[]The controlled value of the CheckboxGroup. Can be bind as | |
defaultValue | GetItemValue<T, VK, undefined, NestedItem<T>>[]The value of the CheckboxGroup when initially rendered. Use when you do not need to control the state of the CheckboxGroup. | |
size | 'md' | "xs" | "sm" | "md" | "lg" | "xl" |
variant | 'list' | "table" | "list" | "card" |
orientation | 'vertical' | "horizontal" | "vertical"The orientation the checkbox buttons are laid out. |
disabled | boolean When | |
loop | false | boolean Whether keyboard navigation should loop around |
name | stringThe name of the field. Submitted with its owning form as part of a name/value pair. | |
required | boolean When | |
icon | appConfig.ui.icons.check | anyThe icon displayed when checked, or above the label when |
color | 'primary' | "primary" | "secondary" | "success" | "info" | "warning" | "error" | "neutral" |
highlight | boolean Highlight the ring color like a focus state. | |
indicator | 'start' | "start" | "end" | "hidden"Position of the indicator. |
ui | { root?: SlotClass; fieldset?: SlotClass; legend?: SlotClass; item?: SlotClass; } & { root?: SlotClass; container?: SlotClass; base?: SlotClass; indicator?: SlotClass; icon?: SlotClass; wrapper?: SlotClass; label?: SlotClass; description?: SlotClass; } |
Slots
| Slot | Type |
|---|---|
legend | {} |
label | { item: T[number] & { id: string; }; } |
description | { item: T[number] & { id: string; }; } |
Emits
| Event | Type |
|---|---|
update:modelValue | [value: GetItemValue<T, VK, undefined, NestedItem<T>>[]] |
change | [event: Event] |
Theme
export default defineAppConfig({
ui: {
checkboxGroup: {
slots: {
root: 'relative',
fieldset: 'flex gap-x-2',
legend: 'mb-1 block font-medium text-default',
item: ''
},
variants: {
orientation: {
horizontal: {
fieldset: 'flex-row'
},
vertical: {
fieldset: 'flex-col'
}
},
color: {
primary: {},
secondary: {},
success: {},
info: {},
warning: {},
error: {},
neutral: {}
},
variant: {
list: {
fieldset: 'flex-wrap'
},
card: {
fieldset: 'flex-wrap'
},
table: {
item: [
'border border-default hover:not-has-disabled:not-has-focus-visible:not-has-data-[state=checked]:bg-elevated/50',
'transition-colors'
]
}
},
size: {
xs: {
fieldset: 'gap-y-0.5',
legend: 'text-xs'
},
sm: {
fieldset: 'gap-y-0.5',
legend: 'text-xs'
},
md: {
fieldset: 'gap-y-1',
legend: 'text-sm'
},
lg: {
fieldset: 'gap-y-1',
legend: 'text-sm'
},
xl: {
fieldset: 'gap-y-1.5',
legend: 'text-base'
}
},
required: {
true: {
legend: "after:content-['*'] after:ms-0.5 after:text-error"
}
},
highlight: {
true: {},
false: {}
},
disabled: {
true: {}
}
},
compoundVariants: [
{
color: 'primary',
variant: 'table',
class: {
item: 'outline-primary/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-primary has-focus-visible:z-[1]'
}
},
{
color: 'neutral',
variant: 'table',
class: {
item: 'outline-inverted/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-inverted has-focus-visible:z-[1]'
}
},
{
variant: 'table',
highlight: false,
class: {
item: 'hover:not-has-disabled:not-has-focus-visible:not-has-data-[state=checked]:border-accented'
}
},
{
size: 'xs',
variant: 'table',
class: {
item: 'p-2.5'
}
},
{
size: 'sm',
variant: 'table',
class: {
item: 'p-3'
}
},
{
size: 'md',
variant: 'table',
class: {
item: 'p-3.5'
}
},
{
size: 'lg',
variant: 'table',
class: {
item: 'p-4'
}
},
{
size: 'xl',
variant: 'table',
class: {
item: 'p-4.5'
}
},
{
orientation: 'horizontal',
variant: 'table',
class: {
item: 'first-of-type:rounded-s-lg last-of-type:rounded-e-lg',
fieldset: 'gap-0 -space-x-px'
}
},
{
orientation: 'vertical',
variant: 'table',
class: {
item: 'first-of-type:rounded-t-lg last-of-type:rounded-b-lg',
fieldset: 'gap-0 -space-y-px'
}
},
{
color: 'primary',
variant: 'table',
class: {
item: 'has-data-[state=checked]:bg-primary/10 has-data-[state=checked]:border-primary/50 has-data-[state=checked]:z-[1]'
}
},
{
color: 'neutral',
variant: 'table',
class: {
item: 'has-data-[state=checked]:bg-elevated has-data-[state=checked]:border-inverted/50 has-data-[state=checked]:z-[1]'
}
},
{
variant: 'table',
disabled: true,
class: {
item: 'cursor-not-allowed'
}
}
],
defaultVariants: {
highlight: false,
size: 'md',
variant: 'list',
color: 'primary'
}
}
}
})
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import ui from '@nuxt/ui/vite'
export default defineConfig({
plugins: [
vue(),
ui({
ui: {
checkboxGroup: {
slots: {
root: 'relative',
fieldset: 'flex gap-x-2',
legend: 'mb-1 block font-medium text-default',
item: ''
},
variants: {
orientation: {
horizontal: {
fieldset: 'flex-row'
},
vertical: {
fieldset: 'flex-col'
}
},
color: {
primary: {},
secondary: {},
success: {},
info: {},
warning: {},
error: {},
neutral: {}
},
variant: {
list: {
fieldset: 'flex-wrap'
},
card: {
fieldset: 'flex-wrap'
},
table: {
item: [
'border border-default hover:not-has-disabled:not-has-focus-visible:not-has-data-[state=checked]:bg-elevated/50',
'transition-colors'
]
}
},
size: {
xs: {
fieldset: 'gap-y-0.5',
legend: 'text-xs'
},
sm: {
fieldset: 'gap-y-0.5',
legend: 'text-xs'
},
md: {
fieldset: 'gap-y-1',
legend: 'text-sm'
},
lg: {
fieldset: 'gap-y-1',
legend: 'text-sm'
},
xl: {
fieldset: 'gap-y-1.5',
legend: 'text-base'
}
},
required: {
true: {
legend: "after:content-['*'] after:ms-0.5 after:text-error"
}
},
highlight: {
true: {},
false: {}
},
disabled: {
true: {}
}
},
compoundVariants: [
{
color: 'primary',
variant: 'table',
class: {
item: 'outline-primary/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-primary has-focus-visible:z-[1]'
}
},
{
color: 'neutral',
variant: 'table',
class: {
item: 'outline-inverted/25 has-focus-visible:outline-3 not-has-disabled:has-focus-visible:border-inverted has-focus-visible:z-[1]'
}
},
{
variant: 'table',
highlight: false,
class: {
item: 'hover:not-has-disabled:not-has-focus-visible:not-has-data-[state=checked]:border-accented'
}
},
{
size: 'xs',
variant: 'table',
class: {
item: 'p-2.5'
}
},
{
size: 'sm',
variant: 'table',
class: {
item: 'p-3'
}
},
{
size: 'md',
variant: 'table',
class: {
item: 'p-3.5'
}
},
{
size: 'lg',
variant: 'table',
class: {
item: 'p-4'
}
},
{
size: 'xl',
variant: 'table',
class: {
item: 'p-4.5'
}
},
{
orientation: 'horizontal',
variant: 'table',
class: {
item: 'first-of-type:rounded-s-lg last-of-type:rounded-e-lg',
fieldset: 'gap-0 -space-x-px'
}
},
{
orientation: 'vertical',
variant: 'table',
class: {
item: 'first-of-type:rounded-t-lg last-of-type:rounded-b-lg',
fieldset: 'gap-0 -space-y-px'
}
},
{
color: 'primary',
variant: 'table',
class: {
item: 'has-data-[state=checked]:bg-primary/10 has-data-[state=checked]:border-primary/50 has-data-[state=checked]:z-[1]'
}
},
{
color: 'neutral',
variant: 'table',
class: {
item: 'has-data-[state=checked]:bg-elevated has-data-[state=checked]:border-inverted/50 has-data-[state=checked]:z-[1]'
}
},
{
variant: 'table',
disabled: true,
class: {
item: 'cursor-not-allowed'
}
}
],
defaultVariants: {
highlight: false,
size: 'md',
variant: 'list',
color: 'primary'
}
}
}
})
]
})