components / 26

marked combobox

search narrows the noise. the field keeps a hand-drawn edge while every found, focused, and chosen result leaves a different trace.

shadcnnpx shadcn@latest add berkantay/cheez/marked-combobox
live

find before you choose

marked button
queryfocuschoose
results filter as you type
size
ink
character
field mark
chosen mark
value
<MarkedCombobox
  label="find a tool"
  items={tools}
  value={selected}
  onValueChange={setSelected}
  tone="orange"
  size="medium"
  character="rushed"
>
  <MarkedComboboxInputGroup>
    <MarkedComboboxInput placeholder="type to filter…" />
    <MarkedComboboxClear />
    <MarkedComboboxTrigger />
  </MarkedComboboxInputGroup>
  <MarkedComboboxContent>
    <MarkedComboboxEmpty>no matching tools.</MarkedComboboxEmpty>
    <MarkedComboboxList>
      {(tool) => <MarkedComboboxItem value={tool}>{tool.label}</MarkedComboboxItem>}
    </MarkedComboboxList>
  </MarkedComboboxContent>
</MarkedCombobox>
multiple

choices become removable marks

2 selected
compose a toolkit

each selection becomes a keyboard-reachable chip. backspace can remove the last chip without leaving the field.

states

the edge tells you what happened

open each field
empty query
loading
invalid
choose one before continuing
disabled
structure

groups survive the search

labels are announced with their results
01marks3 searchable entries
02components3 searchable entries
03workflow2 searchable entries
reference

api

Base UI behavior, Cheez pressure
partproptypedefaultpurpose
RootitemsItem[] | Group[]source collection and built-in filtering
RootvalueItem | Item[] | nullcontrolled single or multiple selection
Rootmultiplebooleanfalseenable removable selection chips
RootonValueChangefunctionselection callback
RootonInputValueChangefunctionquery or async search callback
Rootfilterfunction | nullbuilt incustom or server-side filtering
RootlabelReactNodenative input label
RooterrorReactNodeinvalid state and alert message
Rootsizesmall | medium | largemediumfield density
RoottoneMarkedComboboxToneorangefield and popup ink
RootcharacterCheezCharacterrusheddrawing personality
RootinteractionMarkCheezTyperounded-boxinput boundary
RootselectedMarkCheezTypecheckselected item symbol
Inputplaceholderstringquery prompt
Contentloadingbooleanfalseannounced loading state
ContentsideOffsetnumber8popup gap
ItemvalueItemselectable value
Itemdisabledbooleanfalseunavailable result
ChipRemovelabelstringaccessible removal name

behavior notes

  • the input owns the accessible combobox role and a native label
  • Arrow Down opens and highlights, Enter selects, and Escape closes
  • typing filters the supplied items without a render-time effect
  • clear and chip removal are real buttons with explicit accessible names
  • the empty and loading regions stay mounted so announcements remain reliable
  • set filter to null when results come from a server
  • all popup positioning, focus management, and selection semantics come from Base UI
  • no Framer Motion is shipped