Native Select
A styled native select — zero-JS and great on mobile — with a chevron.
Installation
npx cano-ui add native-select
Installs lucide-react automatically if missing.
Source
import * as React from "react"
import { ChevronDownIcon } from "lucide-react"
import { cn } from "@/lib/utils"
/**
* A styled native <select> — lightweight, no JS, great on mobile. For rich
* popovers, search, or custom options, reach for the Select component instead.
*/
function NativeSelect({
className,
children,
...props
}: React.ComponentProps<"select">) {
return (
<div data-slot="native-select" className="relative w-full">
<select
className={cn(
"h-9 w-full appearance-none rounded-md border border-input bg-transparent py-1 pr-8 pl-3 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:bg-input/30",
className
)}
{...props}
>
{children}
</select>
<ChevronDownIcon
aria-hidden="true"
className="pointer-events-none absolute top-1/2 right-3 size-4 -translate-y-1/2 text-muted-foreground"
/>
</div>
)
}
export { NativeSelect }
This exact file lands in your project at components/ui/native-select.tsx. It is yours to edit.