label | string · requiredLabel text for accessibility. |
|---|
options | MultiSelectorOptionType[] · requiredArray of items: strings, objects with value/label/icon/disabled, dividers, or sections. |
|---|
value | string[] · requiredCurrently selected values. |
|---|
onChange | (value: string[]) => void · requiredCallback fired when the selection changes. |
|---|
changeAction | (value: string[]) => void | Promise<void>Async action on change. Fires after onChange. |
|---|
placeholder | string · default 'Select...'Placeholder text shown when no value is selected. |
|---|
size | 'sm' | 'md' | 'lg' · default 'md'Size variant for the selector. |
|---|
variant | 'input' | 'ghost' · default 'input'Visual trigger style. input is the bordered input treatment for forms; ghost is borderless and matches ghost buttons for toolbar usage. |
|---|
triggerDisplay | 'count' | 'labels' | 'badges' · default 'count'How to display selected items in the trigger. |
|---|
formatValue | (items: {value: string; label: string}[]) => stringFormats the trigger text when triggerDisplay="count" or "labels". Receives the selected items (value plus resolved label); the count is items.length. Not used by triggerDisplay="badges". |
|---|
maxBadges | number · default 3Maximum badges to show before "+N". Only for triggerDisplay="badges". |
|---|
hasSelectAll | booleanWhether to show a select-all checkbox. |
|---|
selectAllLabel | string · default 'Select all'Label for the select-all checkbox. |
|---|
hasSearch | booleanWhether to show a search input for filtering options. As the user types, the match count (or "No results found") is announced to screen readers via a polite live region. The search field has built-in affordances: a leading magnifier icon and, once a query is typed, a trailing clear (✕) button that resets the query and returns focus to the input. |
|---|
searchPlaceholder | string · default 'Search...'Placeholder text for the search input. |
|---|
emptyText | ReactNode · default 'No options'Content shown in the dropdown panel when there are no options to show, and announced in a polite live region when the panel opens (a string override is announced verbatim; a richer node falls back to the default text). Not shown while isLoading. |
|---|
emptySearchText | ReactNode · default 'No results found'Content shown in the dropdown panel when a search query matches no options, and announced in a polite live region at the same time (a string override is announced verbatim; a richer node falls back to the default text). |
|---|
isDisabled | booleanDisables the selector. |
|---|
isReadOnly | boolean · default falseMakes the selector read-only: the selected values stay visible, focusable, and included in form submission, and retain their combobox identity with aria-readonly. The selection surface, clear action, and disclosure indicator are removed. Unlike isDisabled, the control is not dimmed. isDisabled takes precedence when both are set. |
|---|
htmlName | stringThe HTML name attribute for form submissions. Renders one hidden input per selected value, like a native multi-select. |
|---|
disabledMessage | stringExplains why the selector is disabled. With isDisabled, shows a tooltip on hover/keyboard focus and keeps the trigger focusable via aria-disabled (activation stays blocked). Use this instead of wrapping a disabled MultiSelector in Tooltip. Disabled controls swallow the hover events an external Tooltip needs. |
|---|
isLabelHidden | booleanVisually hides the label while keeping it accessible. |
|---|
description | stringHelper text displayed below the label. |
|---|
isOptional | booleanMarks the field as optional. |
|---|
isRequired | booleanMarks the field as required. |
|---|
isLoading | booleanShows a loading spinner in the trigger. |
|---|
status | {type: 'error' | 'warning' | 'success', message?: string}Validation status with an optional message. |
|---|
statusVariant | 'attached' | 'detached' | 'tooltip' · default 'attached' for input selectors; 'detached' for ghost selectorsHow the status message is placed relative to the input. attached overlaps directly below the bordered input and is only valid for the input variant; ghost selectors detach attached status messages by default. Use tooltip for compact toolbar controls. |
|---|
renderOption | (option: MultiSelectorOptionData) => ReactNodeCustom render function for each selectable option in the dropdown. Not called for dividers, sections, or the select-all row. |
|---|
indicatorPosition | 'start' | 'end' · default 'start'Which edge of the option row carries the checkbox. end pushes it to the far edge of the row, including on the select-all row. |
|---|
presentation | 'popover' | 'bottom-sheet' | 'adaptive' · default 'popover'How the option list is presented. adaptive uses a bottom sheet on compact touch screens and an anchored popover otherwise. |
|---|
width | SizeValueWidth of the field (number = pixels, string used as-is, e.g. "100%"). Sizes the whole field (label, control, and status) so they stay aligned. |
|---|
startIcon | IconType | ReactNodeIcon displayed at the start of the selector trigger. |
|---|
hasClear | boolean · default falseShows a clear button when values are selected. |
|---|
isDefaultOpen | boolean · default falseWhether the dropdown starts open on mount. |
|---|
xstyle | StyleXStylesStyleX styles for layout customization. Must be a stylex.create() value. |
|---|