Combobox
Multi-purpose combobox widget to allow selection from a dynamic set of options.
#
Documentation
#
#
Usage
#
import { Box } from "@optiaxiom/react";
import {
Combobox,
ComboboxCheckboxItem,
ComboboxContent,
ComboboxEmpty,
ComboboxInput,
ComboboxScrollArea,
ComboboxTrigger,
ComboboxValue,
} from "@optiaxiom/react/unstable";
import { useState } from "react";
import { colors } from "./data";
export function App() {
const [items, setItems] = useState(colors);
const [value, setValue] = useState([colors[3]]);
return (
<Combobox
isItemDisabled={(item) => Boolean(item.isDisabled)}
items={items}
itemToString={(item) => (item ? item.label : "")}
onInputValueChange={(inputValue) => {
setItems(
colors.filter(
(color) =>
!inputValue ||
color.label.toLowerCase().includes(inputValue.toLowerCase()),
),
);
}}
onItemSelect={(value) =>
setValue((prev) =>
prev.includes(value)
? prev.filter((v) => v !== value)
: [...prev, value],
)
}
value={value}
>
<ComboboxTrigger w="224">
<ComboboxValue placeholder="Select colors..." />
</ComboboxTrigger>
<ComboboxContent>
<ComboboxInput />
<ComboboxScrollArea>
{items.map((item) => (
<ComboboxCheckboxItem
icon={
<Box
rounded="sm"
style={{ aspectRatio: 1, backgroundColor: item.color }}
/>
}
item={item}
key={item.value}
>
{item.label}
</ComboboxCheckboxItem>
))}
{items.length === 0 && <ComboboxEmpty>No result found</ComboboxEmpty>}
</ComboboxScrollArea>
</ComboboxContent>
</Combobox>
);
}
#
Anatomy
#
import {
Combobox,
ComboboxCheckboxItem,
ComboboxContent,
ComboboxEmpty,
ComboboxFooter,
ComboboxGroup,
ComboboxInput,
ComboboxItem,
ComboboxLabel,
ComboboxRadioItem,
ComboboxScrollArea,
ComboboxSeparator,
ComboboxTrigger,
ComboboxValue,
} from "@optiaxiom/react";
export default () => (
<Combobox>
<ComboboxTrigger>
<ComboboxValue />
</ComboboxTrigger>
<ComboboxContent>
<ComboboxInput />
<ComboboxScrollArea>
<ComboboxItem />
<ComboboxCheckboxItem />
<ComboboxRadioItem />
<ComboboxGroup>
<ComboboxLabel />
<ComboboxItem />
<ComboboxCheckboxItem />
<ComboboxRadioItem />
</ComboboxGroup>
<ComboboxEmpty />
<ComboboxSeparator />
</ComboboxScrollArea>
<ComboboxFooter />
</ComboboxContent>
</Combobox>
);
#
Related
#
Autocomplete
Text field with inline autocomplete to show suggestions while allowing freeform user input.
DropdownMenu
Display a dropdown menu.
Select
Single select combobox widget to allow selection from a fixed set of options.
#
Props
#
#
Combobox
#
Doesn't render its own HTML element.
Prop |
---|
defaultOpen false | true Default: false |
inputId string |
inputValue string |
isItemDisabled Return true if items need to be marked as disabled and skipped from keyboard navigation. (item: Item, index: number) => boolean Default: () => false |
items* The items we want to render. Item[] |
itemToKey Return a unique key for each item when the object reference will change during renders. (item: Item) => any Default: (value) => value |
itemToString Return a string representation of items if they are objects. Needed to show selected values inside triggers. (item: Item) => string Default: (value) => (value ? String(value) : "") |
itemToSubItems (value: Item) => Item[] |
onInputValueChange ((inputValue: string) => void) & ((inputValue: string) => void) |
onItemSelect (value: Item) => void |
onOpenChange ((open: boolean) => void) & ((open: boolean) => void) |
open false | true |
selectedItem Item |
stateReducer (state: UseComboboxState<Item>, actionAndChanges: UseComboboxStateChangeOptions<Item>) => Partial<UseComboboxState<Item>> |
value Item[] | Set<Item> |
#
ComboboxTrigger
#
Supports all Button props in addition to its own. Renders a <button>
element.
Prop |
---|
addonAfter Display content inside the button after ReactNode |
addonBefore Display content inside the button before ReactNode |
appearance Control the appearance by selecting between the different button types. "default" | "danger" | "primary" | "subtle" | "danger-outline" | "inverse" |
asChild Change the default rendered element for the one passed as a child, merging their props and behavior. Read the Composition guide for more details. false | true |
className string |
disabled Whether the button is disabled. false | true |
icon Display an icon before or after the button content or omit ReactNode |
iconOnly Whether button should have square shape. false | true |
iconPosition Control whether to show the icon before or after the button content. "end" | "start" |
loading Whether to show loading spinner inside the button. false | true |
size Control the size of the button. "sm" | "md" | "lg" |
#
ComboboxValue
#
Supports all Box props in addition to its own. Renders a <div>
element.
Prop |
---|
asChild Change the default rendered element for the one passed as a child, merging their props and behavior. Read the Composition guide for more details. false | true |
className string |
placeholder string |
#
ComboboxContent
#
Supports all Box props in addition to its own. Renders a <div>
element.
Prop |
---|
asChild Change the default rendered element for the one passed as a child, merging their props and behavior. Read the Composition guide for more details. false | true |
className string |
minW Whether to set the min-width to the width of the trigger. "0" | "trigger" |
onCloseAutoFocus Event handler called when auto-focusing on close. Can be prevented. (event: Event) => void |
onEscapeKeyDown Event handler called when the escape key is down. Can be prevented. (event: KeyboardEvent) => void |
onFocusOutside Event handler called when the focus moves outside of the (event: FocusOutsideEvent) => void |
onInteractOutside Event handler called when an interaction happens outside the (event: FocusOutsideEvent | PointerDownOutsideEvent) => void |
onOpenAutoFocus Event handler called when auto-focusing on open. Can be prevented. (event: Event) => void |
onPointerDownOutside Event handler called when the a (event: PointerDownOutsideEvent) => void |
#
ComboboxInput
#
Supports all Input props in addition to its own. Renders a <div>
element but forwards all props to an inner <input>
element.
Prop |
---|
addonAfter Display content inside the input at the end. ReactNode |
addonBefore Display content inside the input at the start. ReactNode |
addonPointerEvents When this prop is set to "none" | "auto" |
appearance Control the appearance of the input. "number" | "default" |
asChild Change the default rendered element for the one passed as a child, merging their props and behavior. Read the Composition guide for more details. false | true |
className string |
disabled Whether the input is disabled. false | true |
error Whether to show the input error state. false | true |
htmlSize Control the native input number |
size Control the size of the input. "md" | "lg" | "xl" |
#
ComboboxScrollArea
#
Supports all Box props in addition to its own. Renders a <div>
element.
Prop |
---|
asChild Change the default rendered element for the one passed as a child, merging their props and behavior. Read the Composition guide for more details. false | true |
className string |
#
ComboboxItem
#
Supports all Box props in addition to its own. Renders a <div>
element.
Prop |
---|
asChild Change the default rendered element for the one passed as a child, merging their props and behavior. Read the Composition guide for more details. false | true |
className string |
item* The exact item object from the collection. unknown |
selected Whether to override the default selected state. false | true |
#
ComboboxCheckboxItem
#
Supports all Box props in addition to its own. Renders a <div>
element.
Prop |
---|
addonAfter Display content inside the item after ReactNode |
addonBefore Display content inside the item before ReactNode |
asChild Change the default rendered element for the one passed as a child, merging their props and behavior. Read the Composition guide for more details. false | true |
className string |
description Add secondary text after the primary label. ReactNode |
icon Display an icon before the item content. ReactNode |
intent Control the appearance by selecting between the different item types. "danger" | "neutral" |
item* The exact item object from the collection. unknown |
selected Whether to override the default selected state. false | true |
#
ComboboxRadioItem
#
Supports all Box props in addition to its own. Renders a <div>
element.
Prop |
---|
addonAfter Display content inside the item after ReactNode |
addonBefore Display content inside the item before ReactNode |
asChild Change the default rendered element for the one passed as a child, merging their props and behavior. Read the Composition guide for more details. false | true |
className string |
description Add secondary text after the primary label. ReactNode |
icon Display an icon before the item content. ReactNode |
intent Control the appearance by selecting between the different item types. "danger" | "neutral" |
item* The exact item object from the collection. unknown |
selected Whether to override the default selected state. false | true |
#
ComboboxGroup
#
Supports all Box props in addition to its own. Renders a <div>
element.
Prop |
---|
asChild Change the default rendered element for the one passed as a child, merging their props and behavior. Read the Composition guide for more details. false | true |
className string |
#
ComboboxLabel
#
Supports all Box props in addition to its own. Renders a <div>
element.
Prop |
---|
asChild Change the default rendered element for the one passed as a child, merging their props and behavior. Read the Composition guide for more details. false | true |
className string |
#
ComboboxSeparator
#
Supports all Separator props in addition to its own. Renders a <div>
element.
Prop |
---|
asChild Change the default rendered element for the one passed as a child, merging their props and behavior. Read the Composition guide for more details. false | true |
className string |
decorative Whether or not the component is purely decorative. When true, accessibility-related attributes are updated so that that the rendered element is removed from the accessibility tree. false | true |
orientation ResponsiveValue<"horizontal" | "vertical"> |
#
ComboboxEmpty
#
Supports all Box props in addition to its own. Renders a <div>
element.
Prop |
---|
asChild Change the default rendered element for the one passed as a child, merging their props and behavior. Read the Composition guide for more details. false | true |
className string |
#
ComboboxFooter
#
Supports all Box props in addition to its own. Renders a <div>
element.
Prop |
---|
asChild Change the default rendered element for the one passed as a child, merging their props and behavior. Read the Composition guide for more details. false | true |
className string |
#
Changelog
#
#
0.4.0
#
- Added component