For AI agents: the complete documentation index is available at https://wallarm.github.io/design-system/llms.txt, the full documentation bundle is available at https://wallarm.github.io/design-system/llms-full.txt, and this page is available as Markdown at https://wallarm.github.io/design-system/components/filter-dropdown.md.

FilterDropdown

A lightweight filter for a list or table toolbar: a 36px trigger that opens a menu and narrows the list by one attribute. Picks apply at once — there is no Apply step. Single mode is for exclusive values and starts with «All …», which is also the reset; multi mode ticks several values that are OR-ed and clears with the ✕. From eight options the menu gains a search, and in multi mode a "Selected" section on top. Reach for Select inside forms, and for FilterInput when the query combines several attributes and operators.

Source · Storybook

Usage

import { FilterDropdown, FilterDropdownTrigger } from '@wallarm-org/design-system/FilterDropdown';

Examples

Multi

Multi mode: checkboxes, OR-ed, the menu stays open. The trigger shows the name with the value or a count, and the ✕ (or Backspace on the trigger) clears. Pass your own FilterDropdownClear as the trigger's child to put an analytics id on the ✕.

Label forms

Every form the trigger takes: dashed while unset, solid with a shadow once set.

States

Disabled keeps the value readable — the ✕ and the count stay visible, just inert.

From searchThreshold options (8 by default) the menu gains a search that takes focus on open, and multi mode repeats what was picked in a "Selected" section on top. It is a snapshot: rows stay put while you tick, and it hides while a query is active.

Groups

A groupBy collection renders one labelled group per entry of useFilterDropdown().groups.

Hint

hint puts secondary text, such as a count, at the right end of a row, before the check.

Long labels

The trigger stops at 180px and ellipsises, with the full value on hover; the menu hugs its options up to 360px and wraps longer ones.

Filter row

The toolbar it is made for: a search, scoped views, then one filter per attribute.

Controlled

Controlled with value / onValueChange. The handler only ever receives your own values — [] for unset — never the internal «All» or "Selected" ones.

Props

PropTypeDefaultDescription
titlestring | undefined
defaultCheckedboolean | undefined
autoFocusboolean | undefined
idstringThe unique identifier of the machine.
tabIndexnumber | undefined
relstring | undefined
onChangeChangeEventHandler<T, Element> | undefined
disabledboolean | undefinedfalseWhether the select is disabled
asChildboolean | undefinedUse the provided child element as the default rendered element, combining their props and behavior.
data-testidstring | undefined
positioningPositioningOptions | undefinedOverride default floating positioning (merged with DS defaults).
idsElementIds | undefinedThe ids of the elements in the select. Useful for composition.
loopFocusboolean | undefinedWhether to loop the keyboard navigation through the options
closeOnSelectboolean | undefinedWhether the select should close after an item is selected
openboolean | undefinedWhether the select menu is open
defaultOpenboolean | undefinedWhether the select's open state is controlled by the user
compositeboolean | undefinedWhether the select is a composed with other composite widgets like tabs or combobox
onPointerDownOutsidecomplexFunction called when the pointer is pressed down outside the component
onFocusOutsidecomplexFunction called when the focus is moved outside the component
onInteractOutsidecomplexFunction called when an interaction happens outside the component
presentboolean | undefinedWhether the node is present (controlled by the user)
onExitCompleteVoidFunction | undefinedFunction called when the animation ends in the closed state
onEnterCompleteVoidFunction | undefinedFunction called when the animation ends in the open state
immediateboolean | undefinedWhether to synchronize the present change immediately or defer it to the next frame
autoCompletestring | undefinedThe autocomplete attribute for the hidden select. Enables browser autofill (e.g. "address-level1" for state).
readOnlyboolean | undefinedWhether the select is read-only
requiredboolean | undefinedWhether the select is required
invalidboolean | undefinedWhether the select is invalid
translationsIntlTranslations | undefinedSpecifies the localized strings that identifies the accessibility elements and their states
scrollToIndexFn((details: ScrollToIndexDetails) => void) | undefinedFunction to scroll to a specific index
skipAnimationOnMountboolean | undefinedWhether to allow the initial presence animation.
hideMode"display-none" | "activity"How to hide content when mounted but not present. - 'display-none': HTML hidden attribute. Effects stay alive. - 'activity': React 19 <Activity mode="hidden">. Effects pause. Requires React 19+.
label *stringAttribute name: trigger text in multi mode, the trigger's aria-label, «Clear {label}».
allLabelstring | undefinedAllSingle mode: trigger text while unset and the default text of FilterDropdownAllOption.
collection *ListCollection<T>Items to pick from. groupBy is supported.
multipleboolean | undefinedfalseCheckbox mode: several values, OR-ed, the menu stays open.
valuestring[] | undefinedControlled picked values; [] = unset.
defaultValuestring[] | undefined
onValueChange((details: FilterDropdownValueChangeDetails<T>) => void) | undefined
onOpenChange((details: FilterDropdownOpenChangeDetails) => void) | undefined
searchThresholdnumber | undefinedDEFAULT_SEARCH_THRESHOLDItem count from which the search field and (multi) the "Selected" section appear. Counts the collection's own items only.
filterFn((itemString: string, item: T, query: string) => boolean) | undefinedOverrides the default case-insensitive match on the item label.
selectedOnTopboolean | undefinedtrueMulti mode: pin the picked values under «Selected» on top of the list (from searchThreshold items, hidden while searching). Render FilterDropdownSelected for it.

FilterDropdownAllOption

PropTypeDefaultDescription
titlestring | undefined
defaultCheckedboolean | undefined
defaultValuestring | number | readonly string[] | undefined
autoFocusboolean | undefined
idstring | undefined
tabIndexnumber | undefined
relstring | undefined
onChangeChangeEventHandler<T, Element> | undefined
asChildboolean | undefinedUse the provided child element as the default rendered element, combining their props and behavior.
data-testidstring | undefined
variant{ default: string; brand: string; destructive: string; }
inset{ true: string; }
persistFocusboolean | undefinedWhether hovering outside should clear the highlighted state

FilterDropdownClear

PropTypeDefaultDescription
disabledboolean | undefined
namestring | undefined
type"button" | "submit" | "reset" | undefined
valuestring | number | readonly string[] | undefined
defaultCheckedboolean | undefined
defaultValuestring | number | readonly string[] | undefined
autoFocusboolean | undefined
idstring | undefined
tabIndexnumber | undefined
titlestring | undefined
relstring | undefined
onChangeChangeEventHandler<T, Element> | undefined
data-testidstring | undefined

FilterDropdownContent

PropTypeDefaultDescription
titlestring | undefined
defaultCheckedboolean | undefined
defaultValuestring | number | readonly string[] | undefined
autoFocusboolean | undefined
idstring | undefined
tabIndexnumber | undefined
relstring | undefined
onChangeChangeEventHandler<T, Element> | undefined
data-testidstring | undefined

FilterDropdownEmpty

PropTypeDefaultDescription
titlestring | undefined
defaultCheckedboolean | undefined
defaultValuestring | number | readonly string[] | undefined
autoFocusboolean | undefined
idstring | undefined
tabIndexnumber | undefined
relstring | undefined
onChangeChangeEventHandler<T, Element> | undefined
data-testidstring | undefined

FilterDropdownFooter

PropTypeDefaultDescription
titlestring | undefined
defaultCheckedboolean | undefined
defaultValuestring | number | readonly string[] | undefined
autoFocusboolean | undefined
idstring | undefined
tabIndexnumber | undefined
relstring | undefined
onChangeChangeEventHandler<T, Element> | undefined
data-testidstring | undefined

FilterDropdownFooterClear

PropTypeDefaultDescription
titlestring | undefined
defaultCheckedboolean | undefined
defaultValuestring | number | readonly string[] | undefined
autoFocusboolean | undefined
idstring | undefined
tabIndexnumber | undefined
relstring | undefined
onChangeChangeEventHandler<T, Element> | undefined
type"button" | "submit" | "reset" | undefined
disabledboolean | undefined
namestring | undefined
valuestring | number | readonly string[] | undefined
data-testidstring | undefined
loading{ true: string; }
fullWidth{ true: string; false: string; }

FilterDropdownGroup

PropTypeDefaultDescription
titlestring | undefined
defaultCheckedboolean | undefined
defaultValuestring | number | readonly string[] | undefined
autoFocusboolean | undefined
idstring | undefined
tabIndexnumber | undefined
relstring | undefined
onChangeChangeEventHandler<T, Element> | undefined
asChildboolean | undefinedUse the provided child element as the default rendered element, combining their props and behavior.
data-testidstring | undefined

FilterDropdownGroupLabel

PropTypeDefaultDescription
titlestring | undefined
defaultCheckedboolean | undefined
defaultValuestring | number | readonly string[] | undefined
autoFocusboolean | undefined
idstring | undefined
tabIndexnumber | undefined
relstring | undefined
onChangeChangeEventHandler<T, Element> | undefined
asChildboolean | undefinedUse the provided child element as the default rendered element, combining their props and behavior.
data-testidstring | undefined

FilterDropdownOption

PropTypeDefaultDescription
item *T
hintReactNodeSecondary text at the right end of the row, such as a count.
titlestring | undefined
defaultCheckedboolean | undefined
defaultValuestring | number | readonly string[] | undefined
autoFocusboolean | undefined
idstring | undefined
tabIndexnumber | undefined
relstring | undefined
onChangeChangeEventHandler<T, Element> | undefined
asChildboolean | undefinedUse the provided child element as the default rendered element, combining their props and behavior.
data-testidstring | undefined
variant{ default: string; brand: string; destructive: string; }
inset{ true: string; }
persistFocusboolean | undefinedWhether hovering outside should clear the highlighted state

FilterDropdownSearch

PropTypeDefaultDescription
onChange((query: string) => void) | undefinedCalled after the query changes; the root owns the query itself.
titlestring | undefined
patternstring | undefined
defaultCheckedboolean | undefined
defaultValuestring | number | readonly string[] | undefined
autoFocusboolean | undefined
idstring | undefined
tabIndexnumber | undefined
relstring | undefined
disabledboolean | undefined
namestring | undefined
altstring | undefined
heightstring | number | undefined
srcstring | undefined
widthstring | number | undefined
autoCompleteHTMLInputAutoCompleteAttribute | undefined
maxLengthnumber | undefined
minLengthnumber | undefined
placeholderstring | undefined
readOnlyboolean | undefined
requiredboolean | undefined
checkedboolean | undefined
stepstring | number | undefined
acceptstring | undefined
maxstring | number | undefined
minstring | number | undefined
multipleboolean | undefined
onClear(() => void) | undefinedCalled when the built-in clear button empties the field, before onChange('').
data-testidstring | undefined

FilterDropdownSelected

PropTypeDefaultDescription
labelReactNodeSelected@default 'Selected'
titlestring | undefined
defaultCheckedboolean | undefined
defaultValuestring | number | readonly string[] | undefined
autoFocusboolean | undefined
idstring | undefined
tabIndexnumber | undefined
relstring | undefined
onChangeChangeEventHandler<T, Element> | undefined
asChildboolean | undefinedUse the provided child element as the default rendered element, combining their props and behavior.
data-testidstring | undefined

FilterDropdownTrigger

PropTypeDefaultDescription
titlestring | undefined
defaultCheckedboolean | undefined
defaultValuestring | number | readonly string[] | undefined
autoFocusboolean | undefined
idstring | undefined
tabIndexnumber | undefined
relstring | undefined
onChangeChangeEventHandler<T, Element> | undefined
type"button" | "submit" | "reset" | undefined
disabledboolean | undefined
namestring | undefined
valuestring | number | readonly string[] | undefined
data-testidstring | undefined

Explorer