Skip to content

shadcn.io is an independent project built on shadcn/ui

Free

With Checkboxes Visible Combobox for React

A multi-select category combobox that puts a checkbox on every row and counts the picks on the button.

Every row starts with a checkbox, so it is obvious that several categories can be picked. The button says 1 category or 3 categories, matching the count.

Use it when people might not expect a combobox to take more than one value. One choice, with no boxes, is a Select. In React, Base UI keeps the picks as a list.

Preview

Preview width

Installation

Sign in to get your install command
Free with an account. It carries your token, so the CLI installs everything in one go.
Use email insteadNo credit card

Anatomy

Combobox anatomy: control, input, trigger, content, item, item indicator

Usage

<ComboboxItem
  className="gap-2 [&_.cn-combobox-item-indicator]:hidden"
  key={category.value}
  value={category}
>
  <span
    aria-hidden="true"
    className={cn(
      "flex size-4 shrink-0 items-center justify-center rounded-[4px] border border-input shadow-xs",
      checked &&
        "border-primary bg-primary text-primary-foreground"
    )}
  >
    {checked ? <CheckIcon className="size-3.5" /> : null}
  </span>
  {category.label}
</ComboboxItem>

FAQ

Is the checkbox a real Checkbox component?

No. It's a span drawn like one: a bordered size-4 box that fills with the primary color and shows a CheckIcon when the row is picked. The row itself is the option, so a real checkbox inside it would be a second control in the same place.

What happens to the usual check mark?

It's hidden, so the checkbox is the only mark. The item's indicator is hidden with a class on ComboboxItem.

How does each box know it's checked?

It checks whether the row's category is in the selection the demo keeps in state.

What does the button show?

1 category, 2 categories and so on, or Select categories... when none are picked.

Which categories are listed?

Electronics, Clothing, Books, Sports and Home & Garden. No category found. shows when the search matches none.

How do screen readers know a row is picked?

From the option's own selected state, which the combobox sets. The drawn box is aria-hidden.

API Reference

Combobox

Sets value={category}. The rest is on the Combobox page.