Forms

Select

A native-feeling dropdown select over a list of items.

html
<UiSelect :items="..." />

Items

required

items is the list of options. A bare string or number is the shorthand — it becomes both the label and the value — while the long form is { label, value } with an optional icon and disabled. Two entries aren't options at all: { type: 'label' } prints a group heading and { type: 'divider' } draws a rule, which is how a long list gets sectioned.

Options can be plain strings or { label, value } objects in the same items array.

Model value

modelValue is the selected value — the value of an option, not its label, and an array of them once multiple is set. Pass it to control the selection yourself; bind it with v-model for the usual case where the reader's choice should flow back.

Selected: nothing

Default value

defaultValue is what's selected on first render while the select still owns its own state. It's the right tool for a sensible starting choice — a default currency, the most common option — where you don't otherwise need to hold the value yourself.

Multiple

multiple allows more than one option to be selected, which also switches modelValue from a single value to an array. The trigger then lists the choices instead of showing one.

multiple changes the trigger to show a comma-joined summary rather than tags — use Combobox if you want removable tag chips for multi-select.

Placeholder

placeholder is what the trigger reads while nothing is selected. Phrase it as the instruction it is — “Select a fruit” rather than “Fruit” — since unlike a FormField label it disappears as soon as there's a value to show.

Icon

icon sits at the start of the trigger while nothing is selected — once an option with its own icon is chosen, that one takes over. It's a way to mark what the field is for without spending a label on it.

Disabled

disabled locks the whole select. Individual options can opt out on their own with a per-item disabled instead.

Clearable

clearable shows a button to clear the current selection.

Variant

variant picks between the ringed, transparent outline trigger and the lightly tinted soft one, which has its own section below.

Content

content positions the dropdown relative to the trigger: side, align and sideOffset. Reach for it when the select sits near an edge the list would otherwise open across.

Open

open controls whether the dropdown is showing. Pass it to drive the list from your own state — opening it from a keyboard shortcut, closing it when a step finishes — and bind it with v-model:open so the reader's own clicks still register. Omit it and the select manages that itself.

Default open

defaultOpen starts the dropdown expanded on mount while leaving the open state uncontrolled. It's a narrow tool — a step that exists only to be answered — and wrong wherever the select is one field among several.

Select a fruit

`variant="soft"`

A lightly tinted field with no ring — a lower-emphasis alternative to outline.

Wrapped in `FormField`

Grouped `items`, and a divider entry


API Reference

Generated from the component's source — props, slots and emits as the component actually declares them.

Props

Prop
Type
Default
Description
itemsrequired
SelectItem[]
The list of selectable options, optionally grouped with label and divider items.
string | number | (string | number)[]
The selected value(s). Pass this to fully control the selection yourself.
string | number | (string | number)[]
The initial selected value(s) when uncontrolled.
boolean
false
Allows selecting more than one option.
string
Placeholder text shown in the trigger when nothing is selected.
string
Icon displayed at the start of the trigger when no option is selected.
boolean
false
Disables the select, preventing interaction.
boolean
false
Shows a button to clear the current selection.
"outline" | "soft"
'outline'
The visual style of the select trigger.
SelectContentProps
{ align: 'start', side: 'bottom', sideOffset: 8 }
Positioning options for the dropdown list.
boolean
Controls whether the dropdown list is open. Omit to let the component manage its own open state.
boolean
false
Whether the dropdown list is open by default when uncontrolled.

Emits

Event
Payload
Description
update:modelValue
[value: string | number | (string | number)[] | undefined]
update:open
[value: boolean]

Types

ts
type SelectItem = SelectOption | SelectLabelItem | SelectDividerItem | string | number;
ts
interface SelectOption {
    label: string;
    value: string | number;
    icon?: string;
    disabled?: boolean;
}
ts
interface SelectLabelItem {
    type: "label";
    label: string;
}
ts
interface SelectDividerItem {
    type: "devider" | "divider" | "separator";
}
ts
interface SelectContentProps {
    align?: "start" | "center" | "end";
    side?: "bottom" | "top";
    sideOffset?: number;
}