Listbox

A listbox displays a list of options and allows a user to select one or more of them.


Import

NextUI exports 3 listbox-related components:

  • Listbox: The main component, which is a wrapper for the other components.
  • ListboxSection: The component that contains a group of listbox items.
  • ListboxItem: The component that represents a listbox item.

Usage

Dynamic items

Listbox follows the Collection Components API, accepting both static and dynamic collections.

  • Static: The usage example above shows the static implementation, which can be used when the full list of options is known ahead of time.
  • Dynamic: The example below can be used when the options come from an external data source such as an API call, or update over time.

Disabled Keys

Listbox items can be disabled using the disabledKeys prop to the Listbox component.

Note: It's important to have a unique key for each item, otherwise the disabled keys will not work.

Variants

You can use the variant in the Listbox component to change the hover style of the listbox items.

Single Selection

You can set the selectionMode property as single to allow the user to select only one item at a time.

Multiple Selection

You can set the selectionMode property as multiple to allow the user to select multiple items at a time.

Note: To allow empty selection, you can set the disallowEmptySelection property as false.

With Icons

It is possible to add icons to the listbox items using the startContent / endContent props.

Note: If you use currentColor as the icon color, the icon will have the same color as the item text.

With Description

You can use the description prop to add a description to the listbox item.

With Sections

You can use the ListboxSection component to group listbox items.

Note: Sections without a title must provide an aria-label for accessibility.

Slots

Listbox has 2 components with slots the ListboxItem and ListboxSection components.

ListboxItem

  • base: The main slot for the listbox item. It wraps all the other slots.
  • wrapper: The title and description wrapper.
  • title: The title of the listbox item.
  • description: The description of the listbox item.
  • selectedIcon: The selected icon slot. This is only visible when the item is selected.

ListboxSection

  • base: The main slot for the listbox section. It wraps all the other slots.
  • heading: The title that is render on top of the section group.
  • group: The group of listbox items.
  • divider: The divider that is render between the groups. This is only visible when showDivider is true.

Customizing the listbox

You can customize the Listbox items style by using the itemClasses prop and passing custom Tailwind CSS classes.

Note: In the above example, we've utilized the Boxicons icons collection.

Keyboard Interactions

KeyDescription
HomeMoves focus to the first item.
EndMoves focus to the last item.
ArrowDownWhen focus is on an item, moves focus to the next item.
ArrowUpWhen focus is on an item, moves focus to the previous item.
Enter or SpaceWhen focus is on an item, selects the item.
A-Z or a-zMoves focus to the next menu item with a label that starts with the typed character if such an menu item exists.

Data Attributes

ListboxItem has the following attributes on the base element:

  • data-disabled: When the listbox item is disabled. Based on listbox disabledKeys prop.
  • data-selected: When the listbox item is selected. Based on listbox selectedKeys prop.
  • data-selectable: When the listbox item is selectable. Based on listbox selectionMode prop.
  • data-hover: When the listbox item is being hovered. Based on useHover
  • data-pressed: When the listbox item is pressed. Based on usePress
  • data-focus: When the listbox item is being focused. Based on useFocusRing.
  • data-focus-visible: When the listbox item is being focused with the keyboard. Based on useFocusRing.

Accessibility

  • Exposed to assistive technology as a listbox using ARIA.
  • Support for single, multiple, or no selection.
  • Support for disabled items.
  • Support for sections.
  • Labeling support for accessibility.
  • Support for mouse, touch, and keyboard interactions.
  • Tab stop focus management.
  • Keyboard navigation support including arrow keys, home/end, page up/down, select all, and clear.
  • Automatic scrolling support during keyboard navigation.
  • Typeahead to allow focusing options by typing text.

API

Listbox Props

AttributeTypeDescriptionDefault
children*ReactNode[]The children to render. Usually a list of ListboxItem or ListboxSection-
itemsIterable<T>Item objects in the collection. (dynamic)-
variantsolid | bordered | light | flat | faded | shadowThe listbox items appearance style.solid
colordefault | primary | secondary | success | warning | dangerThe listbox items color theme.default
selectionModenone | single | multipleThe type of selection that is allowed in the collection.-
selectedKeysReact.Key[]The currently selected keys in the collection (controlled).-
disabledKeysReact.Key[]The item keys that are disabled. These items cannot be selected, focused, or otherwise interacted with.-
defaultSelectedKeysall | React.Key[]The initial selected keys in the collection (uncontrolled).-
disallowEmptySelectionbooleanWhether the collection allows empty selection.false
autoFocusboolean | first | lastWhere the focus should be set.false
shouldFocusWrapbooleanWhether keyboard navigation is circular.false
disableAnimationbooleanWhether to disable the animation of the listbox items.false
itemClassesRecord<"base"| "wrapper"| "title"| "description"| "selectedIcon", string>Allows to set custom class names for the listbox item slots.-

Listbox Events

AttributeTypeDescription
onAction(key: React.Key) => voidHandler that is called when an item is selected.
onSelectionChange(keys: React.Key[]) => voidHandler that is called when the selection changes.

ListboxSection Props

AttributeTypeDescriptionDefault
children*ReactNodeThe contents of the listbox section. Usually a list of ListboxItem components. (static)-
titlestringThe title of the listbox section.-
itemsIterable<T>Item objects in the collection. (dynamic)-
showDividerbooleanWhether to show the divider between the groups.false
DividerPropsDividerPropsThe divider component props.-
classNamesRecord<"base"| "heading"| "group"| "divider", string>Allows to set custom class names for the listbox section slots.-
itemClassesRecord<"base"| "wrapper"| "title"| "description"| "shortcut" | "selectedIcon", string>Allows to set custom class names for the listbox item slots.-

ListboxItem Props

AttributeTypeDescriptionDefault
children*ReactNodeThe contents of the listbox item.-
keyReact.KeyThe unique key for the listbox item.-
titlestring | ReactNodeThe title of the listbox item.-
textValuestringA string representation of the item's contents, used for features like typeahead.-
descriptionstring | ReactNodeThe description of the listbox item.-
shortcutstring | ReactNodeThe listbox item keyboard shortcut.-
startContentReactNodeThe start content of the listbox item.-
endContentReactNodeThe end content of the listbox item. This is positioned after the shortcut and the selected icon.-
selectedIconSelectedIconPropsCustom icon to render when the item is selected.-
showDividerbooleanWhether to show a divider below the item.false
isDisabledbooleanWhether the listbox item should be disabled. (Deprecated) pass disabledKeys to Listbox instead.false
isSelectedbooleanWhether the listbox item should be selected. (Deprecated) pass selectedKeys to Listbox instead.false
isReadOnlybooleanWhether the listbox item press events should be ignored.false
classNamesRecord<"base"| "wrapper"| "title"| "description"| "shortcut" | "selectedIcon", string>Allows to set custom class names for the listbox item slots.-

ListboxItem Events

AttributeTypeDescription
onAction() => voidHandler that is called when the listbox item is selected. (Deprecated) pass to Listbox instead.
onPress(e: PressEvent) => voidHandler called when the press is released over the target.
onPressStart(e: PressEvent) => voidHandler called when a press interaction starts.
onPressEnd(e: PressEvent) => voidHandler called when a press interaction ends, either over the target or when the pointer leaves the target.
onPressChange(isPressed: boolean) => voidHandler called when the press state changes.
onPressUp(e: PressEvent) => voidHandler called when a press is released over the target, regardless of whether it started on the target or not.
onKeyDown(e: KeyboardEvent) => voidHandler called when a key is pressed.
onKeyUp(e: KeyboardEvent) => voidHandler called when a key is released.
onClickMouseEventHandlerThe native button click event handler (Deprecated) use onPress instead.

Types

Listbox Item Selected Icon Props

export type ListboxItemSelectedIconProps = {
/**
* The current icon, usually an checkmark icon.
*/
icon?: ReactNode;
/**
* The current selected status.
*/
isSelected?: boolean;
/**
* The current disabled status.
* @default false
*/
isDisabled?: boolean;
};
type selectedIcon?: ReactNode | ((props: ListboxItemSelectedIconProps) => ReactNode) | null;