Listbox
The Listbox component presents a list of options and allows a user to select one or more of them. The component uses the ARIA listbox role and implements the W3C ARIA APG Listbox Pattern. Combine it with the Field component to access all functionalities.
Examples
Base
Listboxes are great and accessible select menus for your app, complete with robust support for keyboard navigation and, unlike HTML <select> elements, may contain images. The v-model can be used to bind the selected value. By default the component allows a single option to be chosen.
Accessibility Note:
When assistive technologies present a listbox, the name of an option is calculated by the browser as a flat string. Therefore, the content of an option should not contain any semantic information, such as a heading. In addition, assistive technologies does not provide an accessible way to present a list of interactive elements for the listbox role, such as links, buttons, or checkboxes.Multiple
When the multiple prop is used, the component become a multi-select listbox that allows multiple options to be selected. The v-model now contains a list of all selected items.
Options
Instead of using the <o-list-item> component directly inside the default slot, an options prop can be defined, which can be used to specify the options programmatically. It accepts several different formats of values:
- An array of primitives
['A', 'B', 'C'] - An object literal with key-value pairs
{ a: 'A', b: 'B', c: 'C' } - An array of objects with
labelandvalueproperties - Grouped options by adding additional
optionsto the option object.
Note
The options prop works the same as the Select input component options prop.
Filterable
The component provides a built-in filtering feature, which can be enabled by adding the filterable property. A custom filter function can be defined using the filter property. By default, a lowercased label string comparison is performed.
Slots
A custom header and footer can be added before and after the options list by using the header and footer slots. You can also display content, when no options are visible, either because there are no options or because they are hidden through filtering, using the empty slot.
Infinite Scroll & Async Data
When having to many options, consider adding a max height using the scrollHeight property, which allows to cap the list at a fixed max-height. This will render a long list of options with a scrollbar. The component will emit a scroll-start or scroll-end event, when the top or bottom of the list is reached. These events can be used to load more options as needed. Consider adding backend-filtering when updating options manually in response to changes in the filter value.
Listbox Component
Listbox is used to select one or more values from a list of items.
<o-listbox></o-listbox>Props
| Prop name | Description | Type | Values | Default |
|---|---|---|---|---|
| animation | Custom animation (transition name) | string | - | From config: listbox: { |
| ariaLabel | Defines a string value that labels an interactive element. | string | - | |
| ariaLabelledby | Identifier of the underlying input element. | string | - | |
| backendFiltering | Items won't be filtered on clientside, use the filter event to filter in your backend | boolean | - | false |
| disabled | Interaction is disabled | boolean | - | false |
| emptyLabel | A label which is displayed when no options are visible | string | - | From config: listbox: { |
| filter | Custom filter function to filter the items based on the input value - default is label string comparison | ((option: unknown, value: string) => boolean) | - | |
| filterDebounce | Number of milliseconds to delay the filter event | number | - | From config: listbox: { |
| filterIcon | Icon of the column search input | string | - | From config: listbox: { |
| filterPlaceholder | Placeholder of the column search input | string | - | From config: listbox: { |
| filterable | Enable an additional searchbar below the header | boolean | - | false |
| iconPack | Icon pack to use | string | mdi, fa, fas and any other custom icon pack | From config: listbox: { |
| id | Same as native id. Also pass the id to an wrapping o-field component - default is an uuid. | string | - | useId() |
| v-model | The selected option value, use v-model to make it two-way binding | string|number|object | - | |
| multiple | Allows multiple selections - converts the modelValue into an array | boolean | - | |
| options | Autocomplete options | OptionsPropWithGroups<unknown> | - | |
| override | Override existing theme classes completely | boolean | - | |
| scrollHeight | Height of the listbox, a scrollbar is defined if height of list exceeds this value | number | string | - | From config: listbox: { |
| selectOnFocus | Select current focused item when focused | boolean | - | false |
| selectable | Enables item selection | boolean | - | true |
Events
| Event name | Properties | Description |
|---|---|---|
| update:model-value | value unknown | unknown[] - updated modelValue prop | modelValue prop two-way binding |
| select | value unknown - selected value | on select event - fired before update:modelValue |
| filter | value string - filter valueevent Event - native event | on filter change event |
| focus | event Event - native event | on list focus event |
| blur | event Event - native event | on list blur event |
| scroll-start | scrolling inside the list reached the start | |
| scroll-end | scrolling inside the list reached the end |
Slots
| Name | Description | Bindings |
|---|---|---|
| header | Define an additional header | |
| filter | Overridet the filter input | value string - filter input valueonChange (input: string, event: Event): void - on filter input change eventonKeydown (event: Event): void - on filter input keydown event |
| default | Define the listbox items here | |
| empty | Define the content to show if the list is empty | |
| footer | Define an additional footer |
ListItem Component
An option item used by the listbox component.
<o-list-item></o-list-item>Props
| Prop name | Description | Type | Values | Default |
|---|---|---|---|---|
| ariaLabel | Defines a string value that labels an interactive element. | string | - | |
| ariaLabelledby | Identifier of the underlying input element. | string | - | |
| disabled | Item is disabled | boolean | - | false |
| hidden | Define whether the item is visible or not | boolean | - | false |
| icon | Icon to be shown | string | - | |
| iconPack | Icon pack to use | string | mdi, fa, fas and any other custom icon pack | From config: listbox: { |
| iconSize | Icon size | string | small, medium, large | From config: listbox: { |
| label | Item label, unnecessary when default slot is used | string | - | |
| override | Override existing theme classes completely | boolean | - | |
| value | Item value (it will be used as v-model of wrapper component) - default is an uuid | string|number|object | - | useId() |
Events
| Event name | Properties | Description |
|---|---|---|
| click | value unknown - value prop dataevent event - native event | onclick event |
Slots
| Name | Description | Bindings |
|---|---|---|
| default | Override the label, default is label prop | selected boolean - item is selecteddisabled boolean - item is disabled |
Class Inspector
| Class prop | Description | Props | Suffixes | |
|---|---|---|---|---|
| rootClass | Class of the root element. | |||
| disabledClass | Class of the root element when disabled. | disabled | ||
| selectableClass | Class of the root element when selectable. | selectable | ||
| filterableClass | Class of the root element when filterable. | filterable | ||
| multipleClass | Class of the root element when multiple. | multiple | ||
| headerClass | Class of the header slot wrapper element. | |||
| footerClass | Class of the footer slot wrapper element. | |||
| emptyClass | Class of the empty slot wrapper element. | |||
| filterClass | Class of the filter wrapper element. | |||
| listClass | Class of the list element. | |||
| ▷ itemClass | Class of the item element. | |||
| ▷ itemSelectableClass | Class of the item element when is selectable. | |||
| ▷ itemSelectedClass | Class of the item element when is selected. | |||
| ▷ itemFocusedClass | Class of the item element when is focused. | |||
| ▷ itemDisabledClass | Class of the item element when is disabled. | |||
| inputClasses | Classes to apply on the internal input component. More details here. |
Sass Variables
Current theme ➜ Oruga
| SASS Variable | Default |
|---|---|
| $listbox-disabled-opacity | h.useVar("control-disabled-opacity") |
| $listbox-box-shadow | 0 0.5em 1em -0.125em rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.02) |
| $listbox-background-color | h.useVar("control-brackground-color") |
| $listbox-border-color | h.useVar("control-border-color") |
| $listbox-border-style | solid |
| $listbox-border-width | h.useVar("control-border-width") |
| $listbox-border-radius | h.useVar("border-radius") |
| $listbox-item-padding | h.useVar("control-spacer") calc(h.useVar("control-spacer") * 2) |
| $listbox-item-color | h.useVar("font-color") |
| $listbox-item-font-size | h.useVar("font-size") |
| $listbox-item-font-weight | h.useVar("font-weight") |
| $listbox-item-line-height | h.useVar("line-height") |
| $listbox-item-background-color | transparent |
| $listbox-item-active-color | h.useVar("primary-invert") |
| $listbox-item-active-background-color | h.useVar("primary") |
| $listbox-item-hover-background-color | h.useVar("grey-lighter") |
| $listbox-item-hover-color | h.useVar("font-color") |
See ➜ 📄 SCSS file
