Select

A common form component for choosing a predefined value in a dropdown menu.

API reference

Import the component and assemble its parts:

Anatomy
import { Select } from '@base-ui-components/react/select';

<Select.Root>
  <Select.Trigger>
    <Select.Value />
    <Select.Icon />
  </Select.Trigger>

  <Select.Portal>
    <Select.Backdrop />
    <Select.Positioner>
      <Select.ScrollUpArrow />
      <Select.Popup>
        <Select.Arrow />
        <Select.Item>
          <Select.ItemText />
          <Select.ItemIndicator />
        </Select.Item>
        <Select.Separator />
        <Select.Group>
          <Select.GroupLabel />
        </Select.Group>
      </Select.Popup>
      <Select.ScrollDownArrow />
    </Select.Positioner>
  </Select.Portal>
</Select.Root>

Root

Groups all parts of the select. Doesn’t render its own HTML element.

PropTypeDefault
name

string

undefined

defaultValue

null | unknown

null

value

null | unknown

undefined

onValueChange

((value: unknown, event: Event | undefined) => void)

undefined

defaultOpen

boolean

false

open

boolean

undefined

onOpenChange

((open: boolean, event: Event | undefined) => void)

undefined

actionsRef

RefObject

undefined

alignItemToTrigger

boolean

true

modal

boolean

true

onOpenChangeComplete

((open: boolean) => void)

undefined

transitionStatus

TransitionStatus

undefined

disabled

boolean

false

readOnly

boolean

false

required

boolean

false

id

string

undefined

children

ReactNode

undefined

Trigger

A button that opens the select menu. Renders a <div> element.

PropTypeDefault
disabled

boolean

false

children

ReactNode

undefined

className

string | ((state: State) => string)

undefined

render

| ReactElement
| ((props: GenericHTMLProps, state: State) => ReactElement)

undefined

Attribute
Description
data-popup-open
data-pressed
data-disabled
data-readonly
data-required
data-valid
data-invalid
data-dirty
data-touched
data-filled
data-focused

Value

A text label of the currently selected item. Renders a <span> element.

PropTypeDefault
placeholder

string

undefined

children

null | ((value: string) => ReactNode)

undefined

className

string | ((state: unknown) => string)

undefined

render

| ReactElement
| ((props: GenericHTMLProps, state: unknown) => ReactElement)

undefined

Icon

An icon that indicates that the trigger button opens a select menu. Renders a <span> element.

PropTypeDefault
className

string | ((state: unknown) => string)

undefined

render

| ReactElement
| ((props: GenericHTMLProps, state: unknown) => ReactElement)

undefined

Backdrop

An overlay displayed beneath the menu popup. Renders a <div> element.

PropTypeDefault
className

string | ((state: State) => string)

undefined

render

| ReactElement
| ((props: GenericHTMLProps, state: State) => ReactElement)

undefined

Attribute
Description
data-open
data-closed
data-starting-style
data-ending-style

Portal

A portal element that moves the popup to a different part of the DOM. By default, the portal element is appended to <body>.

PropTypeDefault
container

null | HTMLElement | RefObject

undefined

children

ReactNode

undefined

Positioner

Positions the select menu popup against the trigger. Renders a <div> element.

PropTypeDefault
open

boolean

undefined

align

"center" | "end" | "start"

'center'

alignOffset

| number
| ((data: { side, align, anchor, positioner }) => number)

0

side

| "left"
| "right"
| "bottom"
| "top"
| "inline-end"
| "inline-start"

'bottom'

sideOffset

| number
| ((data: { side, align, anchor, positioner }) => number)

0

arrowPadding

number

5

anchor

| null
| Element
| RefObject
| VirtualElement
| (() => null | Element | VirtualElement)

undefined

collisionBoundary

| Element
| "clipping-ancestors"
| Element[]
| { x: number; y: number; height: number; width: number; }

'clipping-ancestors'

collisionPadding

| number
| { left?: number
| undefined; right?: number
| undefined; bottom?: number
| undefined; top?: number
| undefined; }

5

sticky

boolean

false

positionMethod

"fixed" | "absolute"

'absolute'

trackAnchor

boolean

true

className

string | ((state: State) => string)

undefined

render

| ReactElement
| ((props: GenericHTMLProps, state: State) => ReactElement)

undefined

Attribute
Description
data-open
data-closed
data-anchor-hidden
data-side
CSS Variable
Description
--anchor-height
--anchor-width
--available-height
--available-width
--transform-origin

A container for the select items. Renders a <div> element.

PropTypeDefault
id

string

undefined

children

ReactNode

undefined

className

string | ((state: State) => string)

undefined

render

| ReactElement
| ((props: GenericHTMLProps, state: State) => ReactElement)

undefined

Attribute
Description
data-open
data-closed
data-side
data-starting-style
data-ending-style

Arrow

Displays an element positioned against the select menu anchor. Renders a <div> element.

PropTypeDefault
className

string | ((state: State) => string)

undefined

render

| ReactElement
| ((props: GenericHTMLProps, state: State) => ReactElement)

undefined

Attribute
Description
data-open
data-closed
data-uncentered
data-anchor-hidden
data-side

Item

An individual option in the select menu. Renders a <div> element.

PropTypeDefault
label

string

undefined

value

any

null

disabled

boolean

false

children

ReactNode

undefined

className

string | ((state: State) => string)

undefined

render

| ReactElement
| ((props: GenericHTMLProps, state: State) => ReactElement)

undefined

ItemText

A text label of the select item. Renders a <div> element.

PropTypeDefault
className

string | ((state: unknown) => string)

undefined

render

| ReactElement
| ((props: GenericHTMLProps, state: unknown) => ReactElement)

undefined

ItemIndicator

Indicates whether the select item is selected. Renders a <div> element.

PropTypeDefault
children

ReactNode

undefined

className

string | ((state: State) => string)

undefined

keepMounted

boolean

false

render

| ReactElement
| ((props: GenericHTMLProps, state: State) => ReactElement)

undefined

Group

Groups related select items with the corresponding label. Renders a <div> element.

PropTypeDefault
className

string | ((state: unknown) => string)

undefined

render

| ReactElement
| ((props: GenericHTMLProps, state: unknown) => ReactElement)

undefined

GroupLabel

An accessible label that is automatically associated with its parent group. Renders a <div> element.

PropTypeDefault
className

string | ((state: unknown) => string)

undefined

render

| ReactElement
| ((props: GenericHTMLProps, state: unknown) => ReactElement)

undefined

ScrollUpArrow

An element that scrolls the select menu down when hovered. Renders a <div> element.

PropTypeDefault
className

string | ((state: unknown) => string)

undefined

keepMounted

boolean

false

render

| ReactElement
| ((props: GenericHTMLProps, state: unknown) => ReactElement)

undefined

Attribute
Description
data-direction
data-side
data-visible

ScrollDownArrow

An element that scrolls the select menu down when hovered. Renders a <div> element.

PropTypeDefault
className

string | ((state: unknown) => string)

undefined

keepMounted

boolean

false

render

| ReactElement
| ((props: GenericHTMLProps, state: unknown) => ReactElement)

undefined

Attribute
Description
data-direction
data-side
data-visible

Separator

A separator element accessible to screen readers. Renders a <div> element.

PropTypeDefault
orientation

"horizontal" | "vertical"

'horizontal'

className

string | ((state: State) => string)

undefined

render

| ReactElement
| ((props: GenericHTMLProps, state: State) => ReactElement)

undefined