Inputs

Select

Pick one from a short list. Ink check, grouped options, scroll arrows, ghost variant for toolbars. NativeSelect is the platform's own list (its keyboard, the phone's picker) in the same field look.

Live example

Import

Each family is its own entry point, so a page loads only what it uses.

tsx
import { Field } from "@nibapp/ui/components/field";import { NativeSelect } from "@nibapp/ui/components/native-select";import { Select, SelectContent, SelectGroup, SelectGroupLabel, SelectItem, SelectRoot, SelectSeparator, SelectTrigger, SelectValue } from "@nibapp/ui/components/select";

Props

Each component's own props and variants, read from its source. What it also takes from an element or a Base UI part is named below its table.

Field

Label + control + description + error in one.

PropTypeDefaultDescription
labelReactNode—
hintReactNode—

Muted trailing text in the label row — "Optional", a character count…

descriptionReactNode—
errorReactNode—

Forces the field invalid and shows this message. Omit to show the browser's validation message after Base UI validates the control.

orientation"vertical" | "horizontal""vertical"

`vertical` stacks label → control → description. `horizontal` puts the copy on the left and the control on the right — the settings-row layout for switches and compact selects.

nativeLabelbooleantrue

Set to `false` for button controls (Select, Combobox trigger) so clicking the label focuses rather than presses the trigger.

children (required)ReactNode—

Also takes the props of Base UI's Field.Root, except children.

NativeSelect

A select that is the platform's own: `<option>` children, the native keyboard and the phone's own picker, in the kit's field look (the Select trigger's chrome, chevron and sizes). Use it where the native list matters more than a styled one: a language switcher, a long list on the web for phones. Works inside <Field> for its label, description and validation.

PropTypeDefaultDescription
size"sm" | "md" | "lg""md"
blockboolean—
refRef<HTMLSelectElement>—
valuestring—
defaultValuestring—
onValueChange(value: string) => void—

Fires with the chosen option's value.

leadingReactNode—

Icon before the value (a globe for a language).

invalidboolean—

Marks the field invalid outside of a <Field> (inside one, Field drives it).

classNamestring | undefined—

Classes for the frame (width, margins…).

Also takes the props of a <select> element, except ref, size, multiple, value, defaultValue and className.

Select

Single-value select from a list of options: `<Select items={models} defaultValue="opus" />`.

PropTypeDefaultDescription
variant"default" | "ghost""default"
default
Framed, matches Input.
ghost
Chromeless until hovered: toolbars, inline pickers ("Last 7 days ⌄").
size"sm" | "md" | "lg""md"
blockboolean—
items (required)readonly SelectEntry<Value>[]—

Flat options, or groups of options (separated automatically).

placeholderReactNode—
leadingReactNode—

Icon before the value in the trigger.

aria-labelstring—

Required when there's no visible <Field> label.

classNamestring | undefined—

Classes for the trigger.

contentClassNamestring | undefined—
sideSelectContentProps["side"]—
alignSelectContentProps["align"]—
alignItemWithTriggerboolean—

Also takes BaseSelect.Root.Props<Value>, except items, children and multiple.

SelectContent

Portal + positioner + popup + scroll arrows + list in one. Children are items/groups.

PropTypeDefaultDescription
sideComponentProps<typeof BaseSelect.Positioner>["side"]"bottom"
alignComponentProps<typeof BaseSelect.Positioner>["align"]"start"
sideOffsetnumber6
alignItemWithTriggerbooleanfalse

Overlap the trigger so the selected item lines up with the value (macOS-style). Off by default: the kit's popups drop below their trigger.

Also takes .

SelectGroup

Also takes the props of Base UI's Select.Group.

SelectGroupLabel

Also takes the props of Base UI's Select.GroupLabel.

SelectItem

PropTypeDefaultDescription
iconReactNode—

Leading icon (provider logo, lucide icon).

descriptionReactNode—

Secondary line under the label ("Most capable · 1M context").

trailingReactNode—

Trailing adornment before the check (badge, shortcut…).

childrenReactNode—

Also takes the props of Base UI's Select.Item, except children.

SelectSeparator

Also takes the props of Base UI's Select.Separator.

SelectTrigger

PropTypeDefaultDescription
variant"default" | "ghost""default"
default
Framed, matches Input.
ghost
Chromeless until hovered: toolbars, inline pickers ("Last 7 days ⌄").
size"sm" | "md" | "lg""md"
blockboolean—
leadingReactNode—

Icon before the value (e.g. a provider logo).

Also takes .

SelectValue

Also takes the props of Base UI's Select.Value.