@shopify/polaris
Version:
Shopify’s admin product component library
203 lines (139 loc) • 5.33 kB
Markdown
---
name: Listbox
category: Lists and tables
keywords:
- list
- listbox
- list box
- interactive list
---
# Listbox
A Listbox is a vertical list of interactive options, with room for icons, descriptions, and other elements.
---
## Anatomy

A listbox can be composed of:
1. **Options:** The individual options inside the Listbox that merchants can select or deselect.
2. **Dividers:** Placed between items and are useful in complex lists when there’s a lot of information for the merchant to parse.
3. **Section headers:** Used at the begining of a section when it’s necessary to call out the content being displayed. In most cases, the surrounding context should be enough for the merchant to understand the information in the list.
---
## Best practices
Listboxes should:
- Be clearly labeled so it’s noticeable to the merchant what type of options will be available
- Limit the number of options displayed at once
- Indicate a loading state to the merchant while option data is being populated
---
## Content guidelines
### Option lists
Each item in a `Listbox` should be clear and descriptive.
<!-- usagelist -->
#### Do
- Traffic referrer source
#### Don’t
- Source
<!-- end -->
## Patterns that use `Listbox`
Location picker
---
## Examples
### Basic Listbox
Basic implementation of a control element used to let merchants select options
```jsx
function BaseListboxExample() {
return (
<Listbox accessibilityLabel="Basic Listbox example">
<Listbox.Option value="UniqueValue-1">Item 1</Listbox.Option>
<Listbox.Option value="UniqueValue-2">Item 2</Listbox.Option>
<Listbox.Option value="UniqueValue-3">Item 3</Listbox.Option>
</Listbox>
);
}
```
### Listbox with Loading
Implementation of a control element showing a loading indicator to let merchants know more options are being loaded
```jsx
function ListboxWithLoadingExample() {
return (
<Listbox accessibilityLabel="Listbox with loading example">
<Listbox.Option value="UniqueValue-1">Item 1</Listbox.Option>
<Listbox.Option value="UniqueValue-2">Item 2</Listbox.Option>
<Listbox.Option value="UniqueValue-3">Item 3</Listbox.Option>
<Listbox.Loading />
</Listbox>
);
}
```
### Listbox with Action
Implementation of a control element used to let merchants take an action
```jsx
function ListboxWithActionExample() {
return (
<Listbox accessibilityLabel="Listbox with Action example">
<Listbox.Option value="UniqueValue-1">Item 1</Listbox.Option>
<Listbox.Option value="UniqueValue-2" divider>
Item 2
</Listbox.Option>
<Listbox.Action value="ActionValue">
<Stack spacing="tight">
<Icon source={CirclePlusMinor} color="base" />
<div>Add item</div>
</Stack>
</Listbox.Action>
</Listbox>
);
}
```
### Listbox with custom element
Implementation of a control with custom rendering of options
```jsx
function ListboxWithCustomElementExample() {
return (
<Listbox accessibilityLabel="Listbox with custom element example">
<Listbox.Action value="ActionValue" divider>
Add item
</Listbox.Action>
<Listbox.Option value="UniqueValue-1">
<div>Item 1</div>
</Listbox.Option>
<Listbox.Option value="UniqueValue-2">
<div>Item 2</div>
</Listbox.Option>
<Listbox.Option value="UniqueValue-3">
<div>Item 3</div>
</Listbox.Option>
<Listbox.Loading accessibilityLabel="items are loading" />
</Listbox>
);
}
```
---
## Related components
- For a text field and popover container, [use the combobox component](https://polaris.shopify.com/components/forms/combobox)
- [Autocomplete](https://polaris.shopify.com/components/forms/autocomplete) can be used as a convenience wrapper in lieu of Combobox and Listbox.
---
## Accessibility
<!-- content-for: android -->
See Material Design and development documentation about accessibility for Android:
- [Accessible design on Android](https://material.io/design/usability/accessibility.html)
- [Accessible development on Android](https://developer.android.com/guide/topics/ui/accessibility/)
<!-- /content-for -->
<!-- content-for: ios -->
See Apple’s Human Interface Guidelines and API documentation about accessibility for iOS:
- [Accessible design on iOS](https://developer.apple.com/design/human-interface-guidelines/ios/app-architecture/accessibility/)
- [Accessible development on iOS](https://developer.apple.com/accessibility/ios/)
<!-- /content-for -->
<!-- content-for: web -->
### Structure
The `Listbox` component is based on the [Aria 1.2 Listbox pattern](https://www.w3.org/TR/wai-aria-practices-1.2/#Listbox).
It is important to not present interactive elements inside of list box options as they can interfere with navigation
for assistive technology users.
<!-- usagelist -->
#### Do
- Use labels
#### Don’t
- Use interactive elements inside the list
<!-- end -->
### Keyboard support
- Access the list of options with the up and down arrow keys
- Select an option that has focus with the <kbd>enter</kbd>/<kbd>return</kbd> key
<!-- /content-for -->