React Faceted Filter Sidebar

The faceting engine on its own, not bolted to a table. Parametric Search bundles an Advanced Table and Resource Library bundles a card grid; this owns only the facets and hands the filtered items back through a render prop, so the same sidebar can drive a table, a card grid, a map, or anything you can render from an array.

48 results
KEL-MC1000EOL

Kelvin · MCU · QFN-32

$0.40Out of stock
STM-RE1007Active

STMicro · Regulator · TSSOP-16

$4.10511 in stock
INF-OP1014Active

Infineon · Op-amp · SOIC-8

$7.80922 in stock
ANA-MO1021Preview

Analog Devices · MOSFET · SOT-23

$1.501,333 in stock
ONS-SE1028Active

onsemi · Sensor · BGA-64

$5.201,744 in stock
TEX-IN1035NRND

Texas Instruments · Interface · QFN-32

$8.90Out of stock
NEX-MC1042Preview

Nexperia · MCU · TSSOP-16

$2.602,566 in stock
KEL-RE1049EOL

Kelvin · Regulator · SOIC-8

$6.302,977 in stock
STM-OP1056Active

STMicro · Op-amp · SOT-23

$10.003,388 in stock
INF-MO1063Preview

Infineon · MOSFET · BGA-64

$3.703,799 in stock
ANA-SE1070NRND

Analog Devices · Sensor · QFN-32

$7.40Out of stock
ONS-IN1077Active

onsemi · Interface · TSSOP-16

$1.104,621 in stock
TEX-MC1084Preview

Texas Instruments · MCU · SOIC-8

$4.805,032 in stock
NEX-RE1091Active

Nexperia · Regulator · SOT-23

$8.505,443 in stock
KEL-OP1098EOL

Kelvin · Op-amp · BGA-64

$2.205,854 in stock
STM-MO1105NRND

STMicro · MOSFET · QFN-32

$5.90Out of stock
INF-SE1112Active

Infineon · Sensor · TSSOP-16

$9.606,676 in stock
ANA-IN1119Active

Analog Devices · Interface · SOIC-8

$3.307,087 in stock
ONS-MC1126Preview

onsemi · MCU · SOT-23

$7.007,498 in stock
TEX-RE1133Active

Texas Instruments · Regulator · BGA-64

$0.707,909 in stock
NEX-OP1140NRND

Nexperia · Op-amp · QFN-32

$4.40Out of stock
KEL-MO1147EOL

Kelvin · MOSFET · TSSOP-16

$8.108,731 in stock
STM-SE1154Active

STMicro · Sensor · SOIC-8

$1.80142 in stock
INF-IN1161Active

Infineon · Interface · SOT-23

$5.50553 in stock
ANA-MC1168Preview

Analog Devices · MCU · BGA-64

$9.20964 in stock
ONS-RE1175NRND

onsemi · Regulator · QFN-32

$2.90Out of stock
TEX-OP1182Active

Texas Instruments · Op-amp · TSSOP-16

$6.601,786 in stock
NEX-MO1189Preview

Nexperia · MOSFET · SOIC-8

$10.302,197 in stock
KEL-SE1196EOL

Kelvin · Sensor · SOT-23

$4.002,608 in stock
STM-IN1203Active

STMicro · Interface · BGA-64

$7.703,019 in stock
INF-MC1210NRND

Infineon · MCU · QFN-32

$1.40Out of stock
ANA-RE1217Active

Analog Devices · Regulator · TSSOP-16

$5.103,841 in stock
ONS-OP1224Active

onsemi · Op-amp · SOIC-8

$8.804,252 in stock
TEX-MO1231Preview

Texas Instruments · MOSFET · SOT-23

$2.504,663 in stock
NEX-SE1238Active

Nexperia · Sensor · BGA-64

$6.205,074 in stock
KEL-IN1245EOL

Kelvin · Interface · QFN-32

$9.90Out of stock
STM-MC1252Preview

STMicro · MCU · TSSOP-16

$3.605,896 in stock
INF-RE1259Active

Infineon · Regulator · SOIC-8

$7.306,307 in stock
ANA-OP1266Active

Analog Devices · Op-amp · SOT-23

$1.006,718 in stock
ONS-MO1273Preview

onsemi · MOSFET · BGA-64

$4.707,129 in stock
TEX-SE1280NRND

Texas Instruments · Sensor · QFN-32

$8.40Out of stock
NEX-IN1287Active

Nexperia · Interface · TSSOP-16

$2.107,951 in stock
KEL-MC1294EOL

Kelvin · MCU · SOIC-8

$5.808,362 in stock
STM-RE1301Active

STMicro · Regulator · SOT-23

$9.508,773 in stock
INF-OP1308Active

Infineon · Op-amp · BGA-64

$3.20184 in stock
ANA-MO1315NRND

Analog Devices · MOSFET · QFN-32

$6.90Out of stock
ONS-SE1322Active

onsemi · Sensor · TSSOP-16

$0.601,006 in stock
TEX-IN1329Active

Texas Instruments · Interface · SOIC-8

$4.301,417 in stock

Installation

npx shadcn@latest add "https://kelvinui.com/registry/faceted-filter.json"

Props

PropTypeDescription
itemsT[]The full dataset to filter
facetsFacetDef<T>[]Facet definitions (see kinds below)
valueFilterStateControlled filter state
defaultValueFilterStateInitial state when uncontrolled
onChange(state, filtered) => voidFires when the filter set or results change
children(filtered: T[]) => React.ReactNodeRender prop for the results view
titlestringSidebar heading (default "Filters")

Four facet kinds, one engine

A FacetDef is a discriminated union, so each kind carries exactly the config it needs and TypeScript narrows on kind:

  • checkbox — multi-select; within a facet the selections are OR-ed. Give an accessor returning a string or a string[] for multi-valued rows like tags. Options are derived from the data unless you pass them.
  • radio — single-select, for mutually exclusive facets like lifecycle. Selecting a second value replaces the first.
  • range — numeric min/max, committed on blur or Enter, with an optional unit.
  • toggle — a boolean gate driven by a predicate, for "in stock" or "RoHS compliant".

Long lists get two affordances a facet sidebar lives or dies on: searchable adds an option-search box, and maxVisible collapses to the first N options behind a "show more". Any facet can be collapsible.

Counts are leave-one-out, and they never lie

The number beside each option is the result count you'd get if you selected it — computed against every other active facet but not this one. That is the distributor convention, and it is the correct one: if selecting a value within a facet narrowed its own options' counts, every count would drop to reflect a choice you haven't made yet, and the ones you didn't pick would misleadingly read zero. Options that would yield nothing dim to signal a dead end without removing them, so the shape of the data stays visible.

Decoupled by construction

The component renders the sidebar, the applied-filter chips, a live result count, and a mobile drawer — and then calls children(filtered) with the surviving items. It never renders your results, which is the point: the demo drives a plain card grid, but the same instance would drive a table or a <canvas> map without changing a line of the filter code. State can be left uncontrolled, or lifted via value / onChange to sync with the URL so a filtered view is shareable. On mobile the whole sidebar folds into a drawer behind a Filters button that carries a badge with the active-facet count, because a filter panel that eats the screen on a phone is a filter panel nobody opens.

New components every week

Get the week's new Kelvin UI components and templates in one short email. No spam, unsubscribe anytime.