Kickresume UI

Command Palette

Search for a command to run...

Native Select

A styled native HTML select element with consistent design system integration.

Loading…
"use client"

import { NativeSelect, NativeSelectOption } from "@/components/ui/native-select"

export default function NativeSelectDemo() {
  return (
    <NativeSelect aria-label="Application stage">
      <NativeSelectOption value="">Select stage</NativeSelectOption>
      <NativeSelectOption value="applied">Applied</NativeSelectOption>
      <NativeSelectOption value="screening">Screening</NativeSelectOption>
      <NativeSelectOption value="interview">Interview</NativeSelectOption>
      <NativeSelectOption value="offer">Offer</NativeSelectOption>
      <NativeSelectOption value="rejected">Rejected</NativeSelectOption>
    </NativeSelect>
  )
}

Installation

pnpm dlx shadcn@latest add @kickresume/native-select

Usage

import { NativeSelect, NativeSelectOptGroup, NativeSelectOption } from "@/components/ui/native-select"
<NativeSelect aria-label="Application stage">
  <NativeSelectOption value="">Select stage</NativeSelectOption>
  <NativeSelectOption value="applied">Applied</NativeSelectOption>
  <NativeSelectOption value="screening">Screening</NativeSelectOption>
  <NativeSelectOption value="interview">Interview</NativeSelectOption>
  <NativeSelectOption value="offer">Offer</NativeSelectOption>
  <NativeSelectOption value="rejected">Rejected</NativeSelectOption>
</NativeSelect>

Composition

Simple

Options placed directly under NativeSelect (no NativeSelectOptGroup).

NativeSelect
├── NativeSelectOption
├── NativeSelectOption
├── NativeSelectOption
└── NativeSelectOption

With groups

Use NativeSelectOptGroup to organize options into categories.

NativeSelect
├── NativeSelectOptGroup
│   ├── NativeSelectOption
│   └── NativeSelectOption
└── NativeSelectOptGroup
    ├── NativeSelectOption
    └── NativeSelectOption

Examples

Groups

Use NativeSelectOptGroup to organize options into categories.

Loading…
"use client"

import {
  NativeSelect,
  NativeSelectOptGroup,
  NativeSelectOption,
} from "@/components/ui/native-select"

export default function NativeSelectGroups() {
  return (
    <NativeSelect aria-label="Role">
      <NativeSelectOption value="">Select a role</NativeSelectOption>
      <NativeSelectOptGroup label="Engineering">
        <NativeSelectOption value="frontend">
          Frontend Engineer
        </NativeSelectOption>
        <NativeSelectOption value="backend">
          Backend Engineer
        </NativeSelectOption>
        <NativeSelectOption value="devops">DevOps Engineer</NativeSelectOption>
      </NativeSelectOptGroup>
      <NativeSelectOptGroup label="Design">
        <NativeSelectOption value="product-designer">
          Product Designer
        </NativeSelectOption>
        <NativeSelectOption value="ux-researcher">
          UX Researcher
        </NativeSelectOption>
      </NativeSelectOptGroup>
      <NativeSelectOptGroup label="Product">
        <NativeSelectOption value="product-manager">
          Product Manager
        </NativeSelectOption>
        <NativeSelectOption value="program-manager">
          Program Manager
        </NativeSelectOption>
      </NativeSelectOptGroup>
    </NativeSelect>
  )
}

Disabled

Add the disabled prop to the NativeSelect component to disable the select.

Loading…
"use client"

import { NativeSelect, NativeSelectOption } from "@/components/ui/native-select"
import { Field, FieldLabel } from "@/components/ui/field"

export default function NativeSelectDisabled() {
  return (
    <Field data-disabled>
      <FieldLabel htmlFor="native-select-disabled">
        Application stage
      </FieldLabel>
      <NativeSelect id="native-select-disabled" disabled>
        <NativeSelectOption value="">Disabled</NativeSelectOption>
        <NativeSelectOption value="applied">Applied</NativeSelectOption>
        <NativeSelectOption value="screening">Screening</NativeSelectOption>
        <NativeSelectOption value="interview">Interview</NativeSelectOption>
      </NativeSelect>
    </Field>
  )
}

Invalid

Use aria-invalid to show validation errors and the data-invalid attribute to the Field component for styling.

Loading…
"use client"

import { NativeSelect, NativeSelectOption } from "@/components/ui/native-select"
import { Field, FieldError, FieldLabel } from "@/components/ui/field"

export default function NativeSelectInvalid() {
  return (
    <Field data-invalid>
      <FieldLabel htmlFor="native-select-invalid">Application stage</FieldLabel>
      <NativeSelect
        id="native-select-invalid"
        aria-describedby="native-select-invalid-error"
        aria-invalid="true"
      >
        <NativeSelectOption value="">Error state</NativeSelectOption>
        <NativeSelectOption value="applied">Applied</NativeSelectOption>
        <NativeSelectOption value="screening">Screening</NativeSelectOption>
        <NativeSelectOption value="interview">Interview</NativeSelectOption>
      </NativeSelect>
      <FieldError id="native-select-invalid-error">
        Select an application stage.
      </FieldError>
    </Field>
  )
}

Size

Use the size prop to change the size of the select.

Loading…
"use client"

import { NativeSelect, NativeSelectOption } from "@/components/ui/native-select"

export default function NativeSelectSize() {
  return (
    <div className="flex flex-col items-start gap-4">
      <NativeSelect
        aria-label="Small application stage"
        size="sm"
        defaultValue="applied"
      >
        <NativeSelectOption value="applied">Applied</NativeSelectOption>
        <NativeSelectOption value="screening">Screening</NativeSelectOption>
        <NativeSelectOption value="interview">Interview</NativeSelectOption>
      </NativeSelect>
      <NativeSelect
        aria-label="Default application stage"
        size="default"
        defaultValue="applied"
      >
        <NativeSelectOption value="applied">Applied</NativeSelectOption>
        <NativeSelectOption value="screening">Screening</NativeSelectOption>
        <NativeSelectOption value="interview">Interview</NativeSelectOption>
      </NativeSelect>
    </div>
  )
}

Native Select vs Select

  • Use NativeSelect for native browser behavior, better performance, or mobile-optimized dropdowns.
  • Use Select for custom styling, animations, or complex interactions.

API Reference

NativeSelect

The main select component that wraps the native HTML select element.

<NativeSelect>
  <NativeSelectOption value="option1">Option 1</NativeSelectOption>
  <NativeSelectOption value="option2">Option 2</NativeSelectOption>
</NativeSelect>
PropTypeDefault
size"sm" | "default""default"

NativeSelectOption

Represents an individual option within the select.

PropTypeDefault
valuestring
disabledbooleanfalse

NativeSelectOptGroup

Groups related options together for better organization.

PropTypeDefault
labelstring
disabledbooleanfalse
<NativeSelectOptGroup label="Fruits">
  <NativeSelectOption value="apple">Apple</NativeSelectOption>
  <NativeSelectOption value="banana">Banana</NativeSelectOption>
</NativeSelectOptGroup>