Combobox Listbox
- Stable
- WCAG 2.2 evidence
- RTL
The list of a Combobox. It opens under the field at its
width, flips to stay in the viewport and scrolls when long. Focus stays in the text field: the arrow keys, Home/End
and Page Up/Down move the active option (aria-activedescendant), Enter selects, Escape closes (WCAG 2.1.1, 4.1.2). The Figma Type is derived from the state, not a prop: Options and Grouped are the options you pass (with
SelectSection / SelectGroupLabel), Loading follows isLoading, Empty shows when nothing matches (React Aria
announces the number of results), and Create appears with onCreate once text is typed. Consumer duties: option wording, translated empty and loading text, and what "create" does with the typed text.
import { ComboboxListbox } from "@nexera-ui/react";- 5
- examples
- 26
- props
- 2
- live controls
- 1
- platform
- 7
- WCAG criteria
- 0
- blocks use it
Try every prop. Copy the code.
Change the props and the code updates. Check light and dark, LTR and RTL, and phone width.
import { ComboboxListbox } from "@nexera-ui/react";
<ComboboxListbox />Examples 4
The same examples as Storybook, rendered live. Open Code to copy one.
Loading
Figma Type=Loading: isLoading with a message; it is announced politely.
import { ComboboxListbox, ComboboxRoot, ComboboxTrigger, FieldLabel } from "@nexera-ui/react";
interface Person {
id: string;
name: string;
}
const people: Person[] = [
{ id: "omar", name: "Omar Farooq" },
{ id: "sara", name: "Sara Khan" },
{ id: "ali", name: "Ali Raza" },
{ id: "hina", name: "Hina Malik" },
];
export function Loading() {
return (
<div className="min-h-96 w-80 max-w-full">
<ComboboxRoot items={[]}>
<FieldLabel>Manager</FieldLabel>
<ComboboxTrigger placeholder="Search people" />
<ComboboxListbox />
</ComboboxRoot>
</div>
);
}
Empty
Figma Type=Empty: nothing matches; React Aria announces "0 options available".
import { ComboboxListbox, ComboboxRoot, ComboboxTrigger, FieldLabel } from "@nexera-ui/react";
interface Person {
id: string;
name: string;
}
const people: Person[] = [
{ id: "omar", name: "Omar Farooq" },
{ id: "sara", name: "Sara Khan" },
{ id: "ali", name: "Ali Raza" },
{ id: "hina", name: "Hina Malik" },
];
export function Empty() {
return (
<div className="min-h-96 w-80 max-w-full">
<ComboboxRoot items={[]}>
<FieldLabel>Manager</FieldLabel>
<ComboboxTrigger placeholder="Search people" />
<ComboboxListbox />
</ComboboxRoot>
</div>
);
}
Create
Figma Type=Create: type text that is not in the list to see the Create option.
import { ComboboxListbox, SelectOption } from "@nexera-ui/react";
interface Person {
id: string;
name: string;
}
<ComboboxListbox onCreate={() => undefined}>
{(person: Person) => <SelectOption id={person.id} label={person.name} />}
</ComboboxListbox>;
Right to left
Right-to-left: rows, group labels and the footer mirror.
import { ComboboxListbox, SelectOption } from "@nexera-ui/react";
interface Person {
id: string;
name: string;
}
<ComboboxListbox keyboardHints={{ navigate: "تنقل", select: "اختيار", close: "إغلاق" }}>
{(person: Person) => <SelectOption id={person.id} label={person.name} />}
</ComboboxListbox>;
Props 26
Press "Try it" on a card to load that prop into the playground.
26 props shown
children*NexeraReactNode | ((item: T) => ReactNode)The options: SelectOption elements (optionally grouped in SelectSection with a SelectGroupLabel), or a function
that renders one option per item of the combobox's items / defaultItems.
isLoadingNexerabooleanShows the Figma Loading row (a spinner and loadingLabel) at the end of the list while results load, instead of
the empty state. The message is announced politely when loading starts (WCAG 4.1.3).
loadingLabelNexerastringText of the loading row, for example "Searching 128 people". Translate it for your locale.
emptyTitleNexeraReactNode | ((inputValue: string) => ReactNode)Title of the Figma Empty state, shown when no option matches. A function receives the typed text. React Aria also
announces "0 options available" (WCAG 4.1.3). Translate it for your locale.
emptyDescriptionNexeraReactNodeHint under the empty title.
onCreateNexera(inputValue: string) => voidShows the Figma Create option for the typed text and is called with that text when it is chosen (click, Enter or
Tab). Needs Combobox or ComboboxRoot around the list.
createLabelNexera(inputValue: string) => ReactNodeLabel of the Create option. Translate it for your locale.
keyboardHintsNexerafalse | ComboboxKeyboardHintsWords of the Figma Footer keyboard hints (↑↓ navigate, ↵ select, esc close), or false to leave the footer out
(for example on touch devices). The footer is visual only; screen readers get the same information from the
combobox role.
placementNexera"bottom" | "bottom left" | "bottom right" | "bottom start" | "bottom end" | "top" | "top left" | "top right" | "top start" | "top end" | "left" | "left top" | "left bottom" | "start" | "start top" | "start bottom" | "right" | "right top" | "right bottom" | "end" | "end top" | "end bottom"Where the list opens relative to the field. It flips to stay inside the viewport.
offsetNexeranumberDistance in px between the field and the list (UNVERIFIED).
classNameNexerastringExtra classes for the list surface, merged last so they win over the defaults.
styleNexeraCSSPropertiesInline style for the list surface.
shouldSelectOnPressUpReact AriabooleanWhether selection should occur on press up instead of press down.
shouldFocusOnHoverReact AriabooleanWhether options should be focused when the user hovers over them.
onActionReact Aria(key: Key) => voidHandler that is called when a user performs an action on an item. The exact user event depends
on the collection's selectionBehavior prop and the interaction modality.
escapeKeyBehaviorReact Aria"clearSelection" | "none"Whether pressing the escape key should clear selection in the listbox or not. Most experiences should not modify this option as it eliminates a keyboard user's ability to easily clear selection. Only use if the escape key is being handled externally or should not trigger selection clearing contextually.
autoFocusReact Ariaboolean | FocusStrategyWhether to auto focus the listbox or an option.
shouldFocusWrapReact AriabooleanWhether focus should wrap around when the end/start is reached.
itemsReact AriaIterable<T>Item objects in the collection.
disabledKeysReact AriaIterable<Key>The item keys that are disabled. These items cannot be selected, focused, or otherwise interacted with.
disallowEmptySelectionReact AriabooleanWhether the collection allows empty selection.
idReact AriastringThe element's unique identifier. See [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id).
aria-labelReact AriastringDefines a string value that labels the current element.
aria-labelledbyReact AriastringIdentifies the element (or elements) that labels the current element.
aria-describedbyReact AriastringIdentifies the element (or elements) that describes the object.
dependenciesReact Ariareadonly any[]Values that should invalidate the item cache when using dynamic collections.
* Required. React Aria props shown are the ones most apps use; the component accepts the rest of its React Aria props too.
Accessible by default.
Built on React Aria, and covered by the WCAG 2.2 evidence generated on every build.
WCAG 2.2 evidence
4 direct · 3 supporting- 1.3.1Info and RelationshipsLevel A · tested directly
- 1.4.10ReflowLevel AA · supporting test
- 1.4.12Text SpacingLevel AA · supporting test
- 2.1.1KeyboardLevel A · tested directly
- 2.3.3Animation from InteractionsLevel AAA · supporting test
- 4.1.2Name, Role, ValueLevel A · tested directly
- 4.1.3Status MessagesLevel AA · tested directly
Fits any width.
Nexera components respond to the space they are given. Drag the corner of the frame, or pick a width.
Styling hooks
Pass className to add Tailwind classes (merged last). State is exposed as data attributes, so you can style it with variants like data-pressed:.
data-focuseddata-hovered
<ComboboxListbox className="data-focused:opacity-90 shadow-sm" />Used in blocks
No block uses ComboboxListbox yet.
Related components
- CalendarDayOne day of a {@link CalendarMonth } grid, built on React Aria `CalendarCell`: a `gridcell` whose button is named by the full, localised date ("Wednesday, October 14, 2026"), with `aria-selected`, `aria-disabled` and the "today" and range descriptions read by screen readers (WCAG 1.3.1, 4.1.2).
- CalendarMonthA month calendar for picking a date or a date range: header with previous / next buttons and the localised month name, weekday row, and six weeks of `CalendarDay`s.
- CheckboxThe bare 18 px checkbox: one independent yes/no choice applied on submit, or a row selector in a table, list or tree.
- CheckboxCardA large checkbox option with an icon, a title and a description, for a few options that need explanation (notification channels, benefits).
- CheckboxFieldA checkbox with a label and optional helper text: the box (the same element as `Checkbox`) followed by the label and description, applied on submit.
- ColorInputA hex colour field with a swatch and a picker popover.
- ColorPickerPicks a colour.
- ColorTokenCardDocumentation card for one colour token: a 96 px colour sample with an "Aa" text sample, then the name, token path, hex value and contrast note as text.