Select

A customizable select component for choosing from a list of options.

"use client";
import {
  Select,
  SelectTrigger,
  SelectValue,
  SelectIcon,
  SelectPortal,
  SelectPositioner,
  SelectPopup,
  SelectItem,
  SelectItemText,
  SelectItemIndicator,
} from "@/components/ui/select/select";
import { Button } from "@/components/ui/button/button";
import styles from "./select-demo.module.css";

const bodiesOfWater = [
  { value: "placeholder", label: "Bodies of Water" },
  { value: "Brook", label: "Brook" },
  { value: "Stream", label: "Stream" },
  { value: "Creek", label: "Creek" },
  { value: "River", label: "River" },
  { value: "Lake", label: "Lake" },
];

export default function SelectDemo() {
  return (
    <Select items={bodiesOfWater} defaultValue="placeholder">
      <SelectTrigger render={<Button variant="outline" size="sm" className={styles.trigger} />}>
        <SelectValue>
          {(value) => (
            <span className={value === "placeholder" ? styles.placeholder : undefined}>
              {bodiesOfWater.find((item) => item.value === value)?.label}
            </span>
          )}
        </SelectValue>
        <SelectIcon />
      </SelectTrigger>
      <SelectPortal>
        <SelectPositioner>
          <SelectPopup>
            <SelectItem value="placeholder" disabled>
              <SelectItemText className={styles.itemText}>Bodies of Water</SelectItemText>
            </SelectItem>
            <SelectItem value="Brook">
              <SelectItemText>Brook</SelectItemText>
              <SelectItemIndicator />
            </SelectItem>
            <SelectItem value="Stream">
              <SelectItemText>Stream</SelectItemText>
              <SelectItemIndicator />
            </SelectItem>
            <SelectItem value="Creek">
              <SelectItemText>Creek</SelectItemText>
              <SelectItemIndicator />
            </SelectItem>
            <SelectItem value="River">
              <SelectItemText>River</SelectItemText>
              <SelectItemIndicator />
            </SelectItem>
            <SelectItem value="Lake">
              <SelectItemText>Lake</SelectItemText>
              <SelectItemIndicator />
            </SelectItem>
          </SelectPopup>
        </SelectPositioner>
      </SelectPortal>
    </Select>
  );
}

Installation

npx shadcn@latest add https://roiui.com/r/select.json

Anatomy

anatomy
import {
Select,
SelectTrigger,
SelectValue,
SelectIcon,
SelectPortal,
SelectPositioner,
SelectPopup,
SelectItem,
SelectItemText,
SelectItemIndicator,
SelectGroup,
} from '../ui/select'

<Select>
  <SelectTrigger>
      <SelectValue />
      <SelectIcon />
  </SelectTrigger>
  <SelectPortal>
      <SelectPositioner>
          <SelectPopup>
              <SelectGroup>
                  <SelectItem>
                      <SelectItemText />
                      <SelectItemIndicator />
                  </SelectItem>
              </SelectGroup>
          </SelectPopup>
      </SelectPositioner>
  </SelectPortal>
</Select>