| description | Use when picking the right "selector" primitive in a shadcn ui app and you are unsure whether to reach for a Native HTML `<select>`, a shadcn Select (Radix Select wrapped, 10 primitives), a Combobox recipe (Popover + Command composed by hand or the new 2026 Combobox primitive), or a Command palette (CommandDialog as a Cmd+K action launcher) ; covers the four-way decision criteria (list size, searchability, async loading, palette UX, mobile-native-picker need), the form-binding contract per selector (Native works with `register`, Radix Select and Combobox require `Controller`), the Combobox-as-recipe composition (Popover + Command + CommandInput + CommandList + CommandEmpty + CommandGroup + CommandItem), the Command-palette hotkey wiring (Cmd+K via `useEffect` + `keydown` listener), the async options pattern (server-fetched, loading state, empty state, error state), and the a11y wiring per selector (`aria-expanded` / `aria-controls` / `aria-activedescendant`). Prevents the canonical selector failures : binding Radix Select with React Hook Form's `register` (the controlled `onValueChange` is swallowed and the form silently captures the placeholder string forever), forgetting `modal={true}` on the Popover wrapping a Combobox (focus escapes when an item is clicked and the list traps the user inside a phantom open state), reaching for Native `<select>` when the list has 30+ items (mobile native picker becomes a scroll trap and desktop styling is unstylable past `appearance`), opening a Command palette without `<CommandDialog>` so it is not portalled and no DialogTitle exists (Radix logs a critical a11y warning, axe-core flags it), rendering an async-loaded Combobox without a loading + empty + error tri-state (users see a frozen "No results" while the request is still in-flight), and omitting `<SelectValue>` inside `<SelectTrigger>` (the selected label never paints, the trigger shows the placeholder permanently). Covers the four selector surfaces verbatim from `apps/v4/registry/new-york-v4/ui/select.tsx`, the shadcn Select composition (10 primitives : Select / SelectTrigger / SelectValue / SelectContent / SelectGroup / SelectLabel / SelectItem / SelectSeparator / SelectScrollUpButton / SelectScrollDownButton), the Radix Select root contract (`value` + `onValueChange` controlled, `defaultValue` uncontrolled, `name`, `dir`, `disabled`, `required`), the SelectContent `position="item-aligned" | "popper"` and `align` defaults, the Combobox legacy recipe (Popover + Command, still the dominant pattern in the wild), the new 2026 Combobox primitive surface (ComboboxInput, ComboboxContent, ComboboxList, ComboboxItem, ComboboxEmpty, ComboboxChips, ComboboxChipsInput, ComboboxGroup, ComboboxLabel, ComboboxCollection, `multiple`, `itemToStringValue`, `showClear`, `autoHighlight`, `render`), the Command-as-palette wiring via `<CommandDialog>` + global hotkey listener, native `<select>` form binding via `register`, the controlled / uncontrolled split, and the `aria-invalid` + `data-invalid` error-state hookup that shadcn-syntax-field consumes. Keywords: shadcn select, shadcn selector, combobox, command palette, native select, when to use Combobox, searchable select, dropdown, how do I make a dropdown, cmd+k, ctrl+k, autocomplete, Select vs Combobox, Combobox vs Command, when to use native select, mobile select picker, SelectTrigger, SelectValue, SelectContent, SelectItem, SelectGroup, SelectLabel, SelectSeparator, position popper, position item-aligned, defaultValue Select, onValueChange Select, Controller Select, register Select, Combobox recipe, Popover Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem, CommandDialog, ComboboxInput, ComboboxContent, ComboboxItem, multiple Combobox, async Combobox, loading state Combobox, no results Combobox, searchable dropdown, typeahead, autocomplete input, command palette hotkey, useEffect keydown, app-wide command palette, action launcher, my dropdown shows the placeholder, select shows placeholder after pick, register Select swallows onValueChange, Combobox items not clickabl… |