Filtration

React faceted filter panel, overlay or inline, with sections, checkbox filters, a results count, and Apply and Clear buttons. State stays in your code.

Filtration opens a panel of filter sections closed by Apply and Clear buttons. State is yours: each section wraps a controlled primitive.

When to use

Use Filtration above search results, tables, and service catalogs when users combine several criteria: status, region, date, category. Stage the changes and apply them together so the results do not jump after every click.

Use the inline panel on wide screens and the overlay on mobile. For a single filter, a Select or Chip row is enough.

Examples

Overlay filter (controlled)

Inline panel (Arabic)

Props

Props declared by Filtration. Native attributes of the underlying element pass through.

<Filtration>

PropTypeDefaultDescription
overlaybooleanFloating overlay anchored to the trigger (default) vs an embedded inline panel.
openbooleanControlled open state (overlay only).
defaultOpenbooleanUncontrolled initial open state (overlay only).
onOpenChange(open: boolean) => void
childrenreact.ReactNode

<FiltrationTrigger>

PropTypeDefaultDescription
size"sm" | "md" | "lg" | "icon" | "icon-md" | "icon-sm" | "icon-xs"
fullWidthboolean
onColorboolean
loadingboolean
startIconreact.ReactNodeLeading icon. For an icon-only button pass the glyph as children with an icon size and an aria-label.
endIconreact.ReactNode
iconFlipbooleanFlip start/end icons horizontally in RTL (for chevrons, arrows, etc.)

<FiltrationResults>

PropTypeDefaultDescription
aria-labelstringNames the applied-filters chip group for assistive tech, e.g. "Applied filters".

<FiltrationPanel>

PropTypeDefaultDescription
deferPointerDownOutsidebooleanWhen true, a 'pointerdown' event outside of the layered element will wait for the interaction's click event before dispatching, allowing third-party code to stop propagation of later events and cancel dismissal.
onEscapeKeyDown(event: KeyboardEvent) => voidEvent handler called when the escape key is down. Can be prevented.
onPointerDownOutside(event: PointerDownOutsideEvent) => voidEvent handler called when the a pointerdown event happens outside of the DismissableLayer. Can be prevented.
onFocusOutside(event: FocusOutsideEvent) => voidEvent handler called when the focus moves outside of the DismissableLayer. Can be prevented.
onInteractOutside(event: PointerDownOutsideEvent | FocusOutsideEvent) => voidEvent handler called when an interaction happens outside the DismissableLayer. Specifically, when a pointerdown event happens outside or focus moves outside of it. Can be prevented.
forceMounttrueUsed to force mounting when more control is needed. Useful when controlling animation with React animation libraries.
onOpenAutoFocus(event: Event) => voidEvent handler called when auto-focusing on open. Can be prevented.
onCloseAutoFocus(event: Event) => voidEvent handler called when auto-focusing on close. Can be prevented.
side"top" | "right" | "bottom" | "left"
sideOffsetnumber
align"center" | "start" | "end"
alignOffsetnumber
arrowPaddingnumber
avoidCollisionsboolean
collisionBoundaryElement | Element[]
collisionPaddingnumber | Partial<Record<"top" | "right" | "bottom" | "left", number>>
sticky"always" | "partial"
hideWhenDetachedboolean
updatePositionStrategy"always" | "optimized"

<FiltrationCheckboxFilter>

PropTypeDefaultDescription
optionsrequiredFiltrationCheckboxOption[]
valuestring[]Controlled selected values.
defaultValuestring[]Uncontrolled initial selected values.
onValueChange(next: string[]) => void
searchablebooleanShow a search field that filters options by label.
searchPlaceholderstring
searchLabelstringAccessible label for the search field (it has no visible label).
collapseAfternumberCollapse to the first N options behind a "Show more" toggle.
showMoreLabel(remaining: number) => ReactNodeMaps the hidden-count → the expand button label. Default Show {n} more.
showLessLabelreact.ReactNode
aria-labelstringDefines a string value that labels the current element.
aria-labelledbystringIdentifies the element (or elements) that labels the current element.
classNamestring

<FiltrationOptionList>

PropTypeDefaultDescription
namestring
formstring
requiredboolean
disabledboolean
dirDirection
orientation"vertical" | "horizontal"
loopboolean
defaultValuestring
valuestring
onValueChange(value: string) => void

<FiltrationOption>

PropTypeDefaultDescription
childrenrequiredreact.ReactNode
asChildboolean
checkedboolean
requiredboolean
valuerequiredstring

<FiltrationFooter>

PropTypeDefaultDescription
applyLabelreact.ReactNode
clearLabelreact.ReactNode
appliedCountnumberAppended to the apply label as (n).
onApply() => void
onClear() => void
closeOnApplybooleanClose the overlay when Apply is pressed (overlay only). Default true.

Accessibility

Each section is a role="group" named by its heading, and the overlay trigger exposes aria-expanded and aria-controls. Filters inside are real checkboxes and inputs with labels.

Apply and Clear are buttons, and the results count is text so screen readers can read how many matches remain.