Select

FluereSelect is a non-editable dropdown: the trigger shows the current option (or a placeholder), a click opens the panel, and you pick an option with pointer or keyboard. The visuals mirror WinUI 3 (Windows App SDK) ComboBox in its non-editable form; the interaction base is reka-ui's Select.

How it differs from Combobox

They look alike, but the responsibilities differ — picking the wrong one hands out input/search for free:

AspectFluereSelectFluereCombobox
TriggerText + chevron only, not editableOptionally an editable text input
Text searchNone (only the base's type-ahead)Yes (textSearchEnabled)
Eventchange (single value)selectionChanged (added / removed)
Best forFixed enumerationsFiltering / free text

Basic usage

v-model binds the selected value; placeholder shows while nothing is selected. Options come from items (value / text / disabled).

Refresh rate

Current: week

Basic usage

Controlled value and clearing

modelValue is the single source of truth; set it to null to fall back to the placeholder. Every selection emits change.

Appearance
Last change: none
Controlled + change + clear

States and the empty list

header / description are linked to the trigger by id; disabled options are skipped by the keyboard; a whole disabled select never opens; when items is empty, #empty supplies the empty-state copy.

Sync speedOne option is disabled; the keyboard skips it.
Disabled as a whole
Empty list
Header / description / disabled / empty

Specification source

ItemValue
ControlWinUI 3 ComboBox (non-editable form; WinUI has no control named Select)
tag/commitwinui3/release/2.5.1 / ba3a8d5
Key filesrc/controls/dev/ComboBox/ComboBox_themeresources.xaml

Implementation notes

  • Trigger: ComboBoxBackground* ← ControlFillColor* → --colorNeutralBackground1 / …Hover / …Pressed / …Disabled; all four sides use ControlElevationBorderBrush → --colorNeutralStrokeAlpha, the bottom edge uses ControlStrokeColorDefault → --colorNeutralStroke1 (the same convention as this library's non-editable FluereCombobox, so two dropdowns on one page do not drift apart).
  • Items: ComboBoxItemBackground* ← SubtleFillColor* → --colorSubtleBackground / …Hover / …Pressed / …Selected; the 3px selection pill uses --colorCompoundBrandBackground.
  • Panel: --borderRadiusXLarge (OverlayCornerRadius), --colorNeutralStroke1 border, --shadow16 (elevation 16), --colorNeutralBackground1 surface.
  • Layering and focus: the popup goes through the 0.4.1 useFlyout (--zIndexNavFlyout plus nested-lift), the trigger through the 0.4.3 useFocusVisual (dual focus rectangle).
  • The panel styles must live in a non-scoped block: reka's SelectContent puts its class on an element teleported to body, which never receives this component's data-v-* — scoped selectors fail silently (jsdom does not resolve var(), so unit tests cannot catch it).
  • Known gaps: high contrast is not implemented; WinUI's IsTextSearchEnabled prefix matching is not implemented (the base's type-ahead is not search); the size scale and WinUI's Compact style are not built.

API

FluereSelect

PropTypeDefaultMapping / notes
modelValueT | nullundefinedControlled value (v-model); undefined means uncontrolled
defaultValueT | nullnullUncontrolled initial value
itemsFluereSelectItem<T>[][]ItemsSource; each item has value / text / disabled
openbooleanundefinedv-model:open; internal state when omitted
defaultOpenbooleanfalseUncontrolled initial open state
disabledbooleanfalseIsEnabled
placeholderstring—PlaceholderText
headerstring—Heading above the trigger; also the accessible name
labelstring—Explicit accessible name (takes precedence over header)
descriptionstring—Helper text below the trigger
namestring—Passed to a hidden input for form submission
bystring | ((a, b) => boolean)—Custom equality (required for object values)
dirDirection—Text direction
maxDropDownHeightnumber504MaxDropDownHeight in px
EventPayloadMapping / notes
update:modelValueT | nullControlled write-back (v-model)
update:openbooleanOpen-state write-back (v-model:open)
change{ value: T | null }Selection changed
SlotNotes
itemCustom item rendering, scope { item, selected }
emptyEmpty-list copy (the library adds no built-in string)
v0.5.0-alpha.1