Skip to content

BbSelectPopover

A searchable picker behind a pill, badge, toolbar control or table cell.

import { BbSelectPopover } from 'bitboss-ui';

On this page

Use it for

Use BbSelectPopover when someone chooses a value from a trigger you design: a status pill, filter chip, avatar stack or table cell. It provides the select engine without drawing a form field.

Use something else when

  • BbSelect: you need a labelled field with guidance and validation
  • BbRadioGroup: a short exclusive choice should remain visible
  • BbDropdown: the rows run commands
  • BbPopover: the panel contains arbitrary content instead of options

Pass Through

Hover or tap a part to outline it. Toggles flip loading, errors and warnings when the component has them — only parts highlight.

Item mapping, custom rows and option identity follow BbSelect.

Build a reliable trigger

Spread the activator props onto the focusable element, give it an explicit accessible name and derive its label from application state.

Assignee

Do not label the trigger from slot text or selectedOptions: provider-backed options are unresolved until they load, so the trigger can start blank. Reflect shown visually when the panel is open.

Coming from v2

As on BbSelect, clicking the current single value now keeps it selected and closes the panel. Use the slot clear callback for an explicit reset.

Multiple selection

Seed an array when using multiple, then summarize it on the trigger you own.

Filters

max limits the count without locking selected options.

Panel actions

Use header to name the panel and footer for clear or done actions.

Destination

The panel slots expose clear, close, focus, query and selectedOptions. The clearable prop instead puts a clear button inside the search field.

Coming from v2

header and footer replace options:prepend, options:append and their :outer variants.

Use disable-writing when a short list is faster to scan than search.

Status

Removing the field also removes filtering and option:add. Provider results still pass through the local substring filter.

Coming from v2allowWriting → disableWriting

disable-writing replaces and inverts allow-writing. filter-by now accepts only string[]; short local arrays also hide search automatically below the configured threshold.

Fetching options

A provider receives (query, prefill, modelValue). Return selected rows during component-initiated loads so values remain resolvable.

Ship to

Unlike BbSelect, a seeded model does not force an eager provider call. Keep the trigger independent of loaded options instead of adding prefill: true just to render its label.

Coming from v2

prefill="focus" becomes 'interaction'. prefill: false is search-first; remove it to load on first open.

Dependent pickers

Use dependencies to refetch and enforce-coherence to remove values absent from the refreshed options.

Filters

Enforcement validates the seeded model on its first load. Each provider-backed instance therefore makes its own request; an empty response can clear a valid selection.

One picker per table row

Resolve shared options once, pass the same array to every row and keep edits in a draft map keyed by row id.

Orders, with an editable status column
ReferenceStatus
ORD-2026-0417
ORD-2026-0418
ORD-2026-0421
ORD-2026-0426
The draft map is the dirty set and the save payload.

Give each picker its own model. One shared ref lets every instance judge and overwrite the same value; one provider per row makes request count follow row count.

Width, placement and mobile

Set a concrete width for compact triggers; avoid 'auto', which expands against the viewport on this fixed-positioned panel.

Below the mobile breakpoint the panel becomes a sheet and placement props stop applying. Style the visible surface with pt:panel and sheet-only corrections with pt:sheet.

Coming from v2flip → disableFlip

Use disable-flip instead of flip. hide-arrow and arrow-padding are removed because this panel has no arrow. offcanvasProps becomes offCanvasProps.