Combobox
Choose from a list of suggested values with full keyboard support.
vue
<script setup lang="ts">
import {
ComboboxRoot,
ComboboxContent,
ComboboxGroup,
ComboboxItem,
ComboboxInput,
ComboboxLabel,
ComboboxEmpty,
} from '@typlog/ui'
const foodItems = [
{
name: 'Fruit',
children: [
{ name: 'Apple' },
{ name: 'Banana' },
{ name: 'Orange' },
{ name: 'Honeydew' },
{ name: 'Grapes' },
{ name: 'Watermelon' },
{ name: 'Cantaloupe' },
{ name: 'Pear' },
],
},
{
name: 'Vegetable',
children: [
{ name: 'Cabbage' },
{ name: 'Broccoli' },
{ name: 'Carrots' },
{ name: 'Lettuce' },
{ name: 'Spinach' },
{ name: 'Bok Choy' },
{ name: 'Cauliflower' },
{ name: 'Potatoes' },
],
},
]
</script>
<template>
<ComboboxRoot>
<ComboboxInput placeholder="Select food..." />
<ComboboxContent>
<template
v-for="group in foodItems"
:key="group.name"
>
<ComboboxGroup v-if="group.children.length">
<ComboboxLabel>
{{ group.name }}
</ComboboxLabel>
<ComboboxItem
v-for="option in group.children"
:key="option.name"
:value="option.name"
>
{{ option.name }}
</ComboboxItem>
</ComboboxGroup>
</template>
<ComboboxEmpty>
<span>No food found</span>
</ComboboxEmpty>
</ComboboxContent>
</ComboboxRoot>
</template>API Reference
ComboboxRoot
The root element of a combobox, it contains all the parts of a combobox.
| Prop | Default | Type |
|---|---|---|
| color | – | |
| highContrast | – | boolean |
| size | – | "1""2""3" |
ComboboxInput
| Prop | Default | Type |
|---|---|---|
| placeholder | – | string |
| radius | – | "none""small""medium""large""full" |
| variant | – | "soft""surface" |
ComboboxContent
| Prop | Default | Type |
|---|---|---|
| variant | – | "solid""soft" |
ComboboxGroup
ComboboxItem
ComboboxLabel
ComboboxEmpty
Examples
Size
vue
<script setup lang="ts">
import {
ComboboxRoot,
ComboboxContent,
ComboboxItem,
ComboboxInput,
ComboboxEmpty,
} from '@typlog/ui'
const fruits = [
{ name: 'Apple' },
{ name: 'Banana' },
{ name: 'Orange' },
{ name: 'Honeydew' },
{ name: 'Grapes' },
{ name: 'Watermelon' },
{ name: 'Cantaloupe' },
{ name: 'Pear' },
]
</script>
<template>
<div class="flex flex-items gap-4">
<ComboboxRoot size="1">
<ComboboxInput placeholder="Select fruit..." />
<ComboboxContent>
<ComboboxItem
v-for="option in fruits"
:key="option.name"
:value="option.name"
>
{{ option.name }}
</ComboboxItem>
<ComboboxEmpty>
<span>No fruit found</span>
</ComboboxEmpty>
</ComboboxContent>
</ComboboxRoot>
<ComboboxRoot size="2">
<ComboboxInput placeholder="Select fruit..." />
<ComboboxContent>
<ComboboxItem
v-for="option in fruits"
:key="option.name"
:value="option.name"
>
{{ option.name }}
</ComboboxItem>
<ComboboxEmpty>
<span>No fruit found</span>
</ComboboxEmpty>
</ComboboxContent>
</ComboboxRoot>
<ComboboxRoot size="3">
<ComboboxInput placeholder="Select fruit..." />
<ComboboxContent>
<ComboboxItem
v-for="option in fruits"
:key="option.name"
:value="option.name"
>
{{ option.name }}
</ComboboxItem>
<ComboboxEmpty>
<span>No fruit found</span>
</ComboboxEmpty>
</ComboboxContent>
</ComboboxRoot>
</div>
</template>Multiple
vue
<script setup lang="ts">
import {
ComboboxRoot,
ComboboxContent,
ComboboxGroup,
ComboboxItem,
ComboboxInput,
ComboboxLabel,
ComboboxEmpty,
} from '@typlog/ui'
const foodItems = [
{
name: 'Fruit',
children: [
{ name: 'Apple' },
{ name: 'Banana' },
{ name: 'Orange' },
{ name: 'Honeydew' },
{ name: 'Grapes' },
{ name: 'Watermelon' },
{ name: 'Cantaloupe' },
{ name: 'Pear' },
],
},
{
name: 'Vegetable',
children: [
{ name: 'Cabbage' },
{ name: 'Broccoli' },
{ name: 'Carrots' },
{ name: 'Lettuce' },
{ name: 'Spinach' },
{ name: 'Bok Choy' },
{ name: 'Cauliflower' },
{ name: 'Potatoes' },
],
},
]
</script>
<template>
<ComboboxRoot multiple>
<ComboboxInput placeholder="Select food..." />
<ComboboxContent>
<template
v-for="group in foodItems"
:key="group.name"
>
<ComboboxGroup v-if="group.children.length">
<ComboboxLabel>
{{ group.name }}
</ComboboxLabel>
<ComboboxItem
v-for="option in group.children"
:key="option.name"
:value="option.name"
>
{{ option.name }}
</ComboboxItem>
</ComboboxGroup>
</template>
<ComboboxEmpty>
<span>No food found</span>
</ComboboxEmpty>
</ComboboxContent>
</ComboboxRoot>
</template>Variant
The input field supports two variants: soft and surface.
vue
<script setup lang="ts">
import {
ComboboxRoot,
ComboboxContent,
ComboboxItem,
ComboboxInput,
ComboboxEmpty,
} from '@typlog/ui'
const fruits = [
{ name: 'Apple' },
{ name: 'Banana' },
{ name: 'Orange' },
{ name: 'Honeydew' },
{ name: 'Grapes' },
{ name: 'Watermelon' },
{ name: 'Cantaloupe' },
{ name: 'Pear' },
]
</script>
<template>
<div class="flex flex-items gap-4">
<ComboboxRoot>
<ComboboxInput placeholder="Select fruit..." variant="soft" />
<ComboboxContent>
<ComboboxItem
v-for="option in fruits"
:key="option.name"
:value="option.name"
>
{{ option.name }}
</ComboboxItem>
<ComboboxEmpty>
<span>No fruit found</span>
</ComboboxEmpty>
</ComboboxContent>
</ComboboxRoot>
<ComboboxRoot>
<ComboboxInput placeholder="Select fruit..." variant="surface" />
<ComboboxContent>
<ComboboxItem
v-for="option in fruits"
:key="option.name"
:value="option.name"
>
{{ option.name }}
</ComboboxItem>
<ComboboxEmpty>
<span>No fruit found</span>
</ComboboxEmpty>
</ComboboxContent>
</ComboboxRoot>
</div>
</template>The content popup supports two variants: soft and solid.
vue
<script setup lang="ts">
import {
ComboboxRoot,
ComboboxContent,
ComboboxItem,
ComboboxInput,
ComboboxEmpty,
} from '@typlog/ui'
const fruits = [
{ name: 'Apple' },
{ name: 'Banana' },
{ name: 'Orange' },
{ name: 'Honeydew' },
{ name: 'Grapes' },
{ name: 'Watermelon' },
{ name: 'Cantaloupe' },
{ name: 'Pear' },
]
</script>
<template>
<div class="flex flex-items gap-4">
<ComboboxRoot>
<ComboboxInput placeholder="Select fruit..." />
<ComboboxContent variant="soft">
<ComboboxItem
v-for="option in fruits"
:key="option.name"
:value="option.name"
>
{{ option.name }}
</ComboboxItem>
<ComboboxEmpty>
<span>No fruit found</span>
</ComboboxEmpty>
</ComboboxContent>
</ComboboxRoot>
<ComboboxRoot>
<ComboboxInput placeholder="Select fruit..." />
<ComboboxContent variant="solid">
<ComboboxItem
v-for="option in fruits"
:key="option.name"
:value="option.name"
>
{{ option.name }}
</ComboboxItem>
<ComboboxEmpty>
<span>No fruit found</span>
</ComboboxEmpty>
</ComboboxContent>
</ComboboxRoot>
</div>
</template>