mirror of
https://github.com/ArthurDanjou/ui.git
synced 2026-01-14 12:14:41 +01:00
Co-authored-by: Daniel Roe <daniel@roe.dev> Co-authored-by: Sébastien Chopin <seb@nuxt.com>
186 lines
4.6 KiB
Markdown
186 lines
4.6 KiB
Markdown
---
|
|
github: true
|
|
headlessui:
|
|
label: 'Listbox'
|
|
to: 'https://headlessui.com/vue/listbox'
|
|
---
|
|
|
|
## Usage
|
|
|
|
::component-example
|
|
#default
|
|
:select-menu-example-basic{class="max-w-[12rem] w-full"}
|
|
|
|
#code
|
|
```vue
|
|
<script setup>
|
|
const people = ['Wade Cooper', 'Arlene Mccoy', 'Devon Webb', 'Tom Cook', 'Tanya Fox', 'Hellen Schmidt', 'Caroline Schultz', 'Mason Heaney', 'Claudie Smitham', 'Emil Schaefer']
|
|
|
|
const selected = ref()
|
|
</script>
|
|
|
|
<template>
|
|
<USelectMenu v-model="selected" :options="people" />
|
|
</template>
|
|
```
|
|
::
|
|
|
|
You can use multiple values but you have to override the `#label` slot and handle the display yourself.
|
|
|
|
::component-example
|
|
#default
|
|
:select-menu-example-multiple{class="max-w-[12rem] w-full"}
|
|
|
|
#code
|
|
```vue
|
|
<script setup>
|
|
const people = ['Wade Cooper', 'Arlene Mccoy', 'Devon Webb', 'Tom Cook', 'Tanya Fox', 'Hellen Schmidt', 'Caroline Schultz', 'Mason Heaney', 'Claudie Smitham', 'Emil Schaefer']
|
|
|
|
const selected = ref([])
|
|
</script>
|
|
|
|
<template>
|
|
<USelectMenu v-model="selected" :options="people" multiple>
|
|
<template #label>
|
|
<span v-if="selected.length" class="font-medium truncate">{{ selected.join(', ') }}</span>
|
|
<span v-else class="block truncate text-gray-400 dark:text-gray-500">Select people</span>
|
|
</template>
|
|
</USelectMenu>
|
|
</template>
|
|
```
|
|
::
|
|
|
|
You can also override the default slot entirely.
|
|
|
|
::component-example
|
|
#default
|
|
:select-menu-example-button{class="max-w-[12rem] w-full"}
|
|
|
|
#code
|
|
```vue
|
|
<script setup>
|
|
const people = ['Wade Cooper', 'Arlene Mccoy', 'Devon Webb', 'Tom Cook', 'Tanya Fox', 'Hellen Schmidt', 'Caroline Schultz', 'Mason Heaney', 'Claudie Smitham', 'Emil Schaefer']
|
|
|
|
const selected = ref(people[3])
|
|
</script>
|
|
|
|
<template>
|
|
<USelectMenu v-slot="{ open }" v-model="selected" :options="people">
|
|
<UButton>
|
|
{{ selected }}
|
|
|
|
<UIcon name="i-heroicons-chevron-right-20-solid" class="w-5 h-5 transition-transform" :class="[open && 'transform rotate-90']" />
|
|
</UButton>
|
|
</USelectMenu>
|
|
</template>
|
|
```
|
|
::
|
|
|
|
You can pass an array of objects to `options` and either compare on the whole object or use the `by` prop to compare on a specific key.
|
|
|
|
::component-example
|
|
#default
|
|
:select-menu-example-objects{class="max-w-[12rem] w-full"}
|
|
#code
|
|
```vue
|
|
<script setup>
|
|
const people = [{
|
|
id: 'benjamincanac',
|
|
label: 'benjamincanac',
|
|
href: 'https://github.com/benjamincanac',
|
|
target: '_blank',
|
|
avatar: { src: 'https://avatars.githubusercontent.com/u/739984?v=4' }
|
|
},
|
|
{
|
|
id: 'Atinux',
|
|
label: 'Atinux',
|
|
href: 'https://github.com/Atinux',
|
|
target: '_blank',
|
|
avatar: { src: 'https://avatars.githubusercontent.com/u/904724?v=4' }
|
|
},
|
|
{
|
|
id: 'smarroufin',
|
|
label: 'smarroufin',
|
|
href: 'https://github.com/smarroufin',
|
|
target: '_blank',
|
|
avatar: { src: 'https://avatars.githubusercontent.com/u/7547335?v=4' }
|
|
},
|
|
{
|
|
id: 'nobody',
|
|
label: 'Nobody',
|
|
icon: 'i-heroicons-user-circle'
|
|
}]
|
|
|
|
const selected = ref(people[0])
|
|
</script>
|
|
|
|
<template>
|
|
<USelectMenu v-model="selected" :options="people">
|
|
<template #label>
|
|
<UIcon v-if="selected.icon" :name="selected.icon" class="w-4 h-4" />
|
|
<UAvatar v-else-if="selected.avatar" v-bind="selected.avatar" size="3xs" />
|
|
|
|
{{ selected.label }}
|
|
</template>
|
|
</USelectMenu>
|
|
</template>
|
|
```
|
|
::
|
|
|
|
### Icon
|
|
|
|
Use any icon from [Iconify](https://icones.js.org) by setting the `icon` prop by using this pattern: `i-{collection_name}-{icon_name}`.
|
|
|
|
::component-card
|
|
---
|
|
baseProps:
|
|
class: 'max-w-[12rem] w-full'
|
|
placeholder: 'Select a person'
|
|
options: ['Wade Cooper', 'Arlene Mccoy', 'Devon Webb', 'Tom Cook', 'Tanya Fox', 'Hellen Schmidt', 'Caroline Schultz', 'Mason Heaney', 'Claudie Smitham', 'Emil Schaefer']
|
|
props:
|
|
icon: 'i-heroicons-magnifying-glass-20-solid'
|
|
excludedProps:
|
|
- icon
|
|
---
|
|
::
|
|
|
|
### Search
|
|
|
|
Use the `searchable` prop to enable search.
|
|
|
|
This will use HeadlessUI [Combobox](https://headlessui.com/vue/combobox) component instead of [Listbox](https://headlessui.com/vue/listbox).
|
|
|
|
::component-card
|
|
---
|
|
baseProps:
|
|
class: 'max-w-[12rem] w-full'
|
|
placeholder: 'Select a person'
|
|
options: ['Wade Cooper', 'Arlene Mccoy', 'Devon Webb', 'Tom Cook', 'Tanya Fox', 'Hellen Schmidt', 'Caroline Schultz', 'Mason Heaney', 'Claudie Smitham', 'Emil Schaefer']
|
|
props:
|
|
searchable: true
|
|
---
|
|
::
|
|
|
|
### Disabled
|
|
|
|
Use the `disabled` prop to disable the SelectMenu.
|
|
|
|
::component-card
|
|
---
|
|
baseProps:
|
|
class: 'max-w-[12rem] w-full'
|
|
placeholder: 'Select a person'
|
|
options: ['Wade Cooper', 'Arlene Mccoy', 'Devon Webb', 'Tom Cook', 'Tanya Fox', 'Hellen Schmidt', 'Caroline Schultz', 'Mason Heaney', 'Claudie Smitham', 'Emil Schaefer']
|
|
props:
|
|
disabled: true
|
|
---
|
|
::
|
|
|
|
## Props
|
|
|
|
:component-props
|
|
|
|
## Preset
|
|
|
|
:component-preset
|