Props
| Name | Type | Default | Description |
|---|---|---|---|
activator | Record<string, any> | HTMLElement | null | undefined | - | External activator element or component ref. When provided, the activator slot is not rendered and event listeners are attached programmatically to the referenced element. |
adaptive | boolean | undefined | `config.adaptive` (`true`) | When Set it per instance only to disagree with the app-wide |
anchor | Record<string, any> | HTMLElement | null | undefined | null | Override the element used for popover positioning and width measurement.
Useful when the focusable activator is narrower than its visual container
(e.g. a button inside a wrapper). Falls back to |
ariaDescribedby | string | string[] | undefined | - | Space-separated IDREF(s) that describe this field for assistive technologies. Accepts either a string or array of ids. |
ariaInvalid | boolean | undefined | - | Explicit invalid state for accessibility semantics.
Falls back to |
autocomplete | string | undefined | "off" | Browser autocomplete hint for the popover search input. |
boundary | string | Record<string, any> | HTMLElement | null | undefined | - | Constrains the popover to a specific boundary element. |
clearable | boolean | undefined | false | Shows a clear button inside the search field's icon stack: it takes the lens' place on hover/focus while there is a query or selection to clear, and resets both. Off by default. Leave it off when the component is wrapped by a control that already exposes its own clear affordance (e.g. BbSelect clears from the activator) to avoid a duplicate clear button. Puts a small clear button inside the search field's icon stack — not on your trigger. For an explicit "empty this" most triggers want the |
compact | boolean | undefined | false | Apply the compact density variant. |
dependencies | unknown[] | undefined | [] | Additional dependencies that trigger item reloading when changed. Compared by value hash, not by reference. Pair it with |
depsDebounceTime | number | undefined | 0 | Debounce delay (ms) for dependency-triggered reloads. |
disabled | boolean | undefined | false | Disables the component. |
disableFlip | boolean | undefined | false | Disables the automatic flip to the opposite side when the popover would overflow (flipping is on by default). Inverts v2's |
disableWriting | boolean | "auto" | "mobile" | "desktop" | undefined | 'auto' | Controls whether the search input is shown inside the popover panel.
Removes the search field, and with it typing, |
enforceCoherence | boolean | undefined | false | Reset modelValue to Opts each instance into a load of its own, because validating a seeded value is impossible without options. One filter costs one request; fifty provider-backed rows cost fifty. That is the reason a table hands every row the same array instead. See example |
filterBy | string[] | undefined | [] | Property paths used to filter options when the user types in the search input.
When empty (default) options are matched against their display text.
When non-empty the provided paths are searched instead of the display text.
To disable filtering entirely set Replaces the match against the display text rather than adding to it, and every listed path must exist on every item or matching throws. With a provider it still applies on top of the response. See example |
groupBy | string | ((item: Item) => string | number | symbol) | undefined | - | Path to item property for grouping options. |
hasErrors | boolean | undefined | false | Marks the component as being in error state. |
hasWarnings | boolean | undefined | false | Marks the component as being in a warning state. Visually mirrors
|
headerHeight | number | undefined | - | Height of group headers in the listbox (px). Defaults to 32px (24px
compact; 36px / 32px on mobile viewports). Only applies when |
id | string | undefined | - | Explicit id for the component. Used to generate ids for listbox and options. |
itemHeight | number | undefined | 28 | Height of the options in the listbox (px). Defaults to 28px (24px compact; 44px / 36px on mobile viewports). An explicit value wins on every viewport. |
itemProps | BbSelectItemProps<Item> | undefined | - | ADDITIONAL row fields resolved from each item — never its text or value
(those stay on |
itemsrequired | Item[] | ((query: string, prefill: boolean, modelValue: any) => Promise<Item[]>) | ((query: string, prefill: boolean, modelValue: any) => Item[]) | [] | Array of items or function to load them asynchronously.
Functions receive An array resolves on mount and costs nothing per instance — which is what makes one popover per table row viable. A function is per-instance, so reach for it only when the options genuinely depend on that instance. See example |
itemText | ItemAccessor<Item, string> | undefined | - | Path to item property for display text or function to extract it. |
itemValue | ItemAccessor<Item> | undefined | - | Path to item property for value or function to extract it. |
loading | boolean | undefined | false | Display the loading state styles. |
loadingText | string | undefined | - | Message shown while items are being loaded. |
max | number | undefined | Infinity | Maximum number of selectable items (limits selection when Applies to |
modelValuerequired | any | - | v-model value. Single value for single select, array for multiple select. |
modelValueDebounceTime | number | undefined | 0 | Debounce delay (ms) for modelValue change handling. |
multiple | boolean | undefined | false | Enable multiple item selection. When true, modelValue must be an array. The model must already be an array on the first render, and there is no chip row: summarising the selection on your trigger is part of owning it. See example |
noDataText | string | undefined | - | Message displayed when no items are available. |
offCanvasProps | Partial<BbOffCanvasProps> | undefined | - | Props for the phone sheet. A |
offset | number | undefined | 4 | Distance (px) between the activator and the popover. |
padding | number | undefined | 10 | Minimum page padding used by floating shift middleware. |
placement | Placement | undefined | "bottom" | Floating placement of the popover. |
prefill | boolean | "interaction" | undefined | "interaction" | Controls when items are pre-loaded.
Unlike an in-field |
pt | PtItemMap<BbSelectPopoverPtPart, BbSelectPopoverOptionPtPart, BbSelectPopoverPtState, Item> | undefined | - | Passthrough, object form: the same keys as the |
pt:clear | PtValue | undefined | - | |
pt:clear:disabled | PtValue | undefined | - | |
pt:clear:open | PtValue | undefined | - | |
pt:clear:selected | PtValue | undefined | - | |
pt:footer | PtValue | undefined | - | |
pt:footer:disabled | PtValue | undefined | - | |
pt:footer:open | PtValue | undefined | - | |
pt:footer:selected | PtValue | undefined | - | |
pt:header | PtValue | undefined | - | |
pt:header:disabled | PtValue | undefined | - | |
pt:header:open | PtValue | undefined | - | |
pt:header:selected | PtValue | undefined | - | |
pt:input | PtValue | undefined | - | |
pt:input:disabled | PtValue | undefined | - | |
pt:input:open | PtValue | undefined | - | |
pt:input:selected | PtValue | undefined | - | |
pt:item-description | PtValue | ((ctx: PtItemCtx<Item, BbSelectPopoverPtState>) => PtItemResult) | undefined | - | |
pt:item-description:disabled | PtValue | undefined | - | |
pt:item-description:open | PtValue | undefined | - | |
pt:item-description:selected | PtValue | undefined | - | |
pt:item-icon | PtValue | ((ctx: PtItemCtx<Item, BbSelectPopoverPtState>) => PtItemResult) | undefined | - | |
pt:item-icon:disabled | PtValue | undefined | - | |
pt:item-icon:open | PtValue | undefined | - | |
pt:item-icon:selected | PtValue | undefined | - | |
pt:item-text | PtValue | ((ctx: PtItemCtx<Item, BbSelectPopoverPtState>) => PtItemResult) | undefined | - | |
pt:item-text:disabled | PtValue | undefined | - | |
pt:item-text:open | PtValue | undefined | - | |
pt:item-text:selected | PtValue | undefined | - | |
pt:list | PtValue | undefined | - | |
pt:list:disabled | PtValue | undefined | - | |
pt:list:open | PtValue | undefined | - | |
pt:list:selected | PtValue | undefined | - | |
pt:option | PtValue | ((ctx: PtItemCtx<Item, BbSelectPopoverPtState>) => PtItemResult) | undefined | - | |
pt:option:disabled | PtValue | undefined | - | |
pt:option:open | PtValue | undefined | - | |
pt:option:selected | PtValue | undefined | - | |
pt:panel | PtValue | undefined | - | |
pt:panel:disabled | PtValue | undefined | - | |
pt:panel:open | PtValue | undefined | - | |
pt:panel:selected | PtValue | undefined | - | |
pt:root | PtValue | undefined | - | |
pt:root:disabled | PtValue | undefined | - | |
pt:root:open | PtValue | undefined | - | |
pt:root:selected | PtValue | undefined | - | |
pt:sheet | PtValue | undefined | - | |
pt:sheet:disabled | PtValue | undefined | - | |
pt:sheet:open | PtValue | undefined | - | |
pt:sheet:selected | PtValue | undefined | - | |
queryDebounceTime | number | undefined | 500 | Debounce delay (ms) before triggering search queries after user input stops. |
readonly | boolean | undefined | false | Prevents opening the popover while keeping the activator accessible. |
searchInputAriaLabel | string | undefined | `t('select.searchLabel')` (`'Search options'`) | Accessible label used by the search input rendered inside the popover.
Falls back to the localized Names the in-panel search field, which defaults to the localized "Search options". It is not the trigger's name — that is the |
selectable | boolean | ((item: Item) => boolean) | undefined | true | Defines whether options are selectable. Can be a global boolean that affects all options or a function that accepts an item and returns a boolean that only affects that item. Non-selectable options are rendered disabled. |
stash | boolean | undefined | false | Accumulate selected items across searches instead of replacing them. Keeps picked options resolvable across searches. It does not help a trigger label, which should never depend on what the component has loaded. See example |
transitionDuration | number | undefined | 250 | Transition duration (ms) for popover show/hide animations. |
width | string | number | undefined | "200" | Width of the popover in pixels, percentage, or Defaults to |
v-model
Values kept in sync through v-model.
| Name | Type | Description |
|---|---|---|
modelValue | any | Holds a single value, or an array under |
Events
| Name | Type | Description |
|---|---|---|
active | (e: "active"): void | Emitted when the component becomes active (focus enters it). |
blur | (e: "blur", event: FocusEvent): void | Emitted when the activator loses focus. |
change | (e: "change", event: Event): void | Emitted when the value changes via native change event. |
click | (e: "click", event: MouseEvent): void | Emitted when the activator is clicked. |
focus | (e: "focus", event: FocusEvent): void | Emitted when the activator receives focus. |
hidden | (e: "hidden"): void | Emitted once the options surface has finished closing. |
hide | (e: "hide"): void | Emitted as soon as the options surface starts to close. |
inactive | (e: "inactive"): void | Emitted when focus moves outside the entire component after it was active. Validate or react on this, not on |
input | (e: "input", event: Event): void | Emitted on native input events from the search input. |
option:add | (e: "option:add", text: string): void | Emitted when the user types a new value and confirms it (Enter key) while
writing is enabled (i.e. |
show | (e: "show"): void | Emitted as soon as the options surface starts to open (the popover, or the sheet on a phone). |
shown | (e: "shown"): void | Emitted once the options surface is open and its open transition has finished. |
update:modelValue | (e: "update:modelValue", value: any): void | Emitted with the next selection value whenever selection changes. |
Slots
The listed properties are the ones exposed to the slot scope.
| Name | Type | Description |
|---|---|---|
activator | BbSelectPopoverActivatorSlotProps | Replaces the default trigger element that opens the select popover. Spread |
footer | BbSelectPopoverPanelSlotProps | Content pinned to the bottom of the panel, below the options list. Rendered in both the desktop popover and the adaptive sheet. Renders below the options list in the desktop popover and the mobile sheet alike. With no field to hang a clear button on, this is usually where an explicit clear action belongs. See example |
group | BbSelectPopoverGroupSlotProps<Item> | Replaces the default group header rendered above grouped options. |
header | BbSelectPopoverPanelSlotProps | Content pinned to the top of the panel, above the search field. Rendered in both the desktop popover and the adaptive sheet. Renders above the search field. On a trigger with no label, a title here is often the only place the panel says what it is for. See example |
loading | { query: string; } | Content shown inside the options dropdown while items are loading. |
no-data | { query: string; focus: () => void; } | Content shown when no options match the query or the list is empty. |
option | BbSelectPopoverOptionSlotProps<Item> | Replaces the default rendering of each option row in the dropdown. |
Changes from v2
Props removed or renamed in 3.0. If you are coming from v2, the answer is here.
allowWritingdisableWritingfails silentlyarrowPaddingremovedfails silentlyflipdisableFlipfails silentlyhasWarninghasWarningsfails silentlyhideArrowremovedfails silentlyoffcanvasPropsoffCanvasPropsfails silentlyshowArrowremovedfails silently