ProductBrand
Join us
Foundations
  • Introduction
  • Colors
  • Typography
  • Icons
  • Illustrations
  • Logos
  • Shadows
Components
  • Accordion
  • Alert Dialog
  • Avatar
  • Badge
  • Button
  • Calendar
  • Card
  • Chart
  • Checkbox
  • Collapsible
  • Combobox
  • Context Menu
  • Date Picker
  • Dialog
  • Drawer
  • Dropdown Menu
  • Fluid Avatar
  • Hover Scroll Text
  • Input
  • Kbd
  • Popover
  • Progress Bar
  • Radio Group
  • Scroll Area
  • Select
  • Selectors
  • Separator
  • Separator Dot
  • Shimmer Text
  • Skeleton
  • Slider
  • Switch
  • Tabs
  • Textarea
  • Toast
  • Tooltip
Compositions
  • Empty State
  • File Attachment
  • Floating Bar
  • Input Banner
  • Markdown Editor
  • Media Controls
  • Product Feature Banner
  • Panels
  • Sidebar
  • Reasoning Trace
  • Pagination
  • Data Table
  • Breadcrumb
  • Thread Outline
Inline
  • Overview
  • Stat Tile
  • Metric Row
  • Comparison Table
  • Chart Card
  • Trend Tile
  • Cite
  • Custom
  • Agent skill

Combobox

Flexible input for selecting from a list with filtering.

Examples

Groups

Multi-select with chips

Creatable

Overview

Combobox is a text input paired with a filtered list of options. Use it when the user picks from a known set but the set is too large for a Select or radio group. Built on Base UI Combobox.

tsx
import {
  Combobox,
  ComboboxContent,
  ComboboxEmpty,
  ComboboxInput,
  ComboboxItem,
  ComboboxList,
} from "@rogo-technologies/ui/combobox";

<Combobox items={languages} itemToStringLabel={(item) => item.value}>
  <ComboboxInput placeholder="Filter..." />
  <ComboboxContent>
    <ComboboxEmpty>No results.</ComboboxEmpty>
    <ComboboxList>
      {(item) => (
        <ComboboxItem key={item.id} value={item}>
          {item.value}
        </ComboboxItem>
      )}
    </ComboboxList>
  </ComboboxContent>
</Combobox>;

Usage

Multi-select with chips

Selected values render as chips inside the input. Type to filter, click an item to add it, click the chip's × to remove. Press Backspace on the empty input to remove the last chip. Useful for sharing flows, tagging, or any input where the user picks several items at once.

tsx
import {
  Combobox,
  ComboboxChips,
  ComboboxChip,
  ComboboxChipsInput,
  ComboboxContent,
  ComboboxList,
  ComboboxItem,
} from "@rogo-technologies/ui/combobox";

<Combobox multiple items={users} itemToStringLabel={(u) => u.name}>
  <ComboboxChips>
    {(selected) =>
      selected.map((u) => (
        <ComboboxChip key={u.id} value={u}>
          {u.name}
        </ComboboxChip>
      ))
    }
    <ComboboxChipsInput placeholder="Add people..." />
  </ComboboxChips>
  <ComboboxContent>
    <ComboboxList>
      {(item) => (
        <ComboboxItem key={item.id} value={item}>
          {item.name}
        </ComboboxItem>
      )}
    </ComboboxList>
  </ComboboxContent>
</Combobox>;

Creatable

Let the user submit a value that isn't in the suggestion list, which is useful for tags, labels, or any free-form set with hints. Append the typed query to items and render a "Create …" row at the end of the list. With autoHighlight, Enter selects it; clicking works the same. The selection callback receives the new string just like any other item, so there's no separate "create" code path.

tsx
const trimmed = query.trim();
const canCreate = trimmed.length > 0 && !suggestions.includes(trimmed) && !tags.includes(trimmed);

<Combobox
  multiple
  items={canCreate ? [...filtered, trimmed] : filtered}
  value={tags}
  onValueChange={setTags}
  inputValue={query}
  onInputValueChange={setQuery}
  autoHighlight
>
  {/* ...chips input... */}
  <ComboboxContent>
    <ComboboxList>
      {filtered.map((t) => (
        <ComboboxItem key={t} value={t}>
          {t}
        </ComboboxItem>
      ))}
      {canCreate && <ComboboxItem value={trimmed}>Create &ldquo;{trimmed}&rdquo;</ComboboxItem>}
    </ComboboxList>
  </ComboboxContent>
</Combobox>;

API

Combobox (Root)

PropTypeDefaultDescription
itemsValue[]-The full list of selectable items.
itemToStringLabel(item: Value) => string-Returns the label string used for filtering & display.
valueValue | Value[] | null-Controlled selection. Array when multiple is true.
defaultValueValue | Value[] | null-Initial selection (uncontrolled).
onValueChange(value: Value | Value[]) => void-Callback when selection changes.
multiplebooleanfalseAllow multi-select with chips.
openboolean-Controlled open state of the popup.
onOpenChange(open: boolean) => void-Callback when popup open state changes.

Subcomponents

ComponentPurpose
ComboboxInputSingle-line text input that opens & filters the list.
ComboboxChipsContainer that renders selected chips alongside input.
ComboboxChipOne selected value rendered as a removable chip.
ComboboxChipsInputInput used inside a ComboboxChips container. Accepts deleteOnBackspace (default true): when true, pressing Backspace on the empty input removes the last chip.
ComboboxContentFloating popup wrapper. Accepts matchTriggerWidth (default true): the popup matches the trigger width; set false to let it grow wider.
ComboboxListList region; render-prop maps over the filtered items.
ComboboxItemA single selectable row. Accepts showCheckbox (default false), which swaps the trailing checkmark for a leading checkbox, for multi-selects.
ComboboxGroupGroup rows under a labeled section.
ComboboxLabelVisible label rendered inside a ComboboxGroup.
ComboboxEmptyShown when the filter has no matches.
ComboboxSeparatorDivider between items.
ComboboxClearButton to clear the current selection.
ComboboxTriggerButton that opens the popup (alternative to typing).
ComboboxInputGroupWraps input + trigger/clear into one styled row.
ComboboxValueRenders the currently selected value (for triggers).

All subcomponents accept standard HTML attributes for their underlying elements.

Guidelines

Do

  • Use Combobox when the user picks from a known set that's too large to scan (more than ~7 items)
  • Provide an itemToStringLabel that matches what users would type
  • Show a ComboboxEmpty state. Never leave the popup blank when filtering yields nothing
  • Use multi-select with chips for tagging, sharing, and similar "pick several" flows
  • Pass showCheckbox on the items of a multiple combobox, so the rows match every other multi-select in the product and an unchosen row still reads as togglable

Don't

  • Don't use Combobox for free-form text entry. Use Input instead
  • Don't use Combobox for short fixed lists (≤ 5 options). Use Select or RadioGroup
  • Don't render hundreds of items eagerly. Virtualize or paginate the source data
  • Don't hide the filtered list while the input has focus, since users expect to see matches as they type
PreviousCollapsible
NextContext Menu
Made in NYC© 2026 Rogo Technologies Inc.

Design at Rogo

We’re redesigning an entire industry. Come design it with us.

See open roles

Design at Rogo

  • How we workThe mission of design at Rogo, and the open roles
  • About RogoThe company and the product