Make your AI a shadcn expert

Shadcn Native Select

React native select for mobile pickers and HTML forms. Built with TypeScript and Tailwind CSS for Next.js using Base UI — option groups and validation states.

A native select is a styled <select>. Click it and the browser opens its own list — on a phone that's the system picker. Use it when the options are plain text and the value should post with the form.

Scroll to load preview...

Looking for a neobrutalism version for shadcn?

Same native select, thicker borders. The NeoBrutalism native select is the kit if you want that look.

Usage

import {
  NativeSelect,
  NativeSelectOptGroup,
  NativeSelectOption,
} from "@/components/ui/native-select"
<NativeSelect>
  <NativeSelectOption value="">Select a fruit</NativeSelectOption>
  <NativeSelectOption value="apple">Button</NativeSelectOption>
  <NativeSelectOption value="banana">CLI</NativeSelectOption>
  <NativeSelectOption value="blueberry">Registry</NativeSelectOption>
  <NativeSelectOption value="pineapple">Docs</NativeSelectOption>
</NativeSelect>

size is sm or default. It replaces the native HTML size attribute.

Composition

NativeSelectOption

Groups

NativeSelectOptGroup is a native <optgroup>. Screen readers announce the label as you arrow through.

Scroll to load preview...

Disabled

disabled greys the wrapper, chevron included. The control stays in the form.

Scroll to load preview...

Invalid

aria-invalid turns the border and ring destructive. Put data-invalid on Field so the label matches.

Scroll to load preview...

RTL

Wrap with DirectionProvider and dir="rtl". Copy stays Arabic. The chevron stays on the end.

Scroll to load preview...

API

Prop

Type

NativeSelectOption

Prop

Type

NativeSelectOptGroup

Prop

Type

Keyboard

KeyAction
Space / Alt+ArrowDownOpen the list
ArrowUp / ArrowDownPrevious / next option
Letter keysJump to a matching option
EnterConfirm the focused option
EscapeClose the list
TabLeave the control

Notes

The open list is the OS picker

You cannot style options. The popup is the platform list — fonts, spacing, and hover are not yours. Need flags, avatars, or a custom row? Use Select.

An empty-value first option plus required is the placeholder. The browser blocks submit until someone picks a real value.

With other components

Questions

Was this page helpful?

Sign in to leave feedback.