vaiperui

componentes / select

Select

Combobox accesible con navegación por teclado, búsqueda al escribir y un estilo detallado con icono/descripción por opción.

Cómo usar

Combobox accesible (`role="combobox"` + `listbox`) con navegación por teclado, typeahead y selección controlada o no. Activa `searchable` para filtrar por texto y `variant="detailed"` para opciones con `leading` y `description`.

preview
Select.tsx
import { Select } from "vaiperui";
<Select
label="País"
placeholder="Elige un país"
searchable
options={[
{ value: "br", label: "Brasil" },
{ value: "us", label: "Estados Unidos" },
{ value: "pt", label: "Portugal" },
]}
/>

Colores

preview
primary
success
warning
danger
colores.tsx
<Select variantColor="primary" label="País" options={options} />
<Select variantColor="success" label="País" options={options} />
<Select variantColor="warning" label="País" options={options} />
<Select variantColor="danger" label="País" options={options} />

Estilos

`detailed` amplía el botón y las opciones, con slot `leading` y `description` por ítem.

preview
default
detailed
estilos.tsx
<Select variant="default" label="País" options={options} />
<Select variant="detailed" label="País" options={options} />

Tamaños

preview
sm
md
lg
tamanos.tsx
<Select size="sm" label="País" options={options} />
<Select size="md" label="País" options={options} />
<Select size="lg" label="País" options={options} />

Radio

preview
none
sm
md
lg
full
radio.tsx
<Select radius="none" label="País" options={options} />
<Select radius="sm" label="País" options={options} />
<Select radius="md" label="País" options={options} />
<Select radius="lg" label="País" options={options} />
<Select radius="full" label="País" options={options} />

Búsqueda

`searchable` agrega un campo para filtrar las opciones por texto.

preview
searchable
searchStyle full
sin búsqueda
busqueda.tsx
<Select searchable label="País" options={options} />
<Select searchable searchStyle="full" label="País" options={options} />
<Select label="País" options={options} />

Estados

`disabled` bloquea todo el select. Una opción con `disabled: true` aparece bloqueada y no se puede elegir.

preview
opción deshabilitada
disabled
estados.tsx
<Select label="País" options={options} disabled />
const options = [
{ value: "br", label: "Brasil" },
{ value: "pt", label: "Portugal", disabled: true },
]

Color personalizado

`customColor` sobrescribe `variantColor` y pinta foco, borde y resaltado desde un único color.

preview
naranja
verde
violeta
custom-color.tsx
<Select customColor="#ff6600" label="País" options={options} />
<Select customColor="#22c55e" label="País" options={options} />
<Select customColor="#a78bfa" label="País" options={options} />

Props

PropValoresPredeterminadoDescripción
optionsSelectOption[]—Lista de opciones ({ value, label, disabled?, description?, leading? })
value / defaultValuestring—Controlado / no controlado
onValueChange(value: string) => void—Se dispara al seleccionar una opción
placeholderstring"Select an option"Texto cuando no hay nada seleccionado
emptyMessagestring"No options found"Texto cuando no hay opciones
noResultsMessage(query: string) => string(query) => `No results for "${query}"`Texto cuando la búsqueda no tiene resultados; recibe el término escrito
searchablebooleanfalseMuestra un campo de búsqueda dentro del menú para filtrar por texto
searchPlaceholderstring"Search..."Placeholder del campo de búsqueda
clearSearchLabelstring"Clear search"Nombre accesible del botón que limpia la búsqueda
searchStyle"boxed" | "full""boxed"`boxed`: campo con margen y redondeado. `full`: el campo ocupa todo el ancho de la parte superior del menú, con divisor
variantdefault | detaileddefaultdefault: dropdown compacto de una línea. detailed: botón y opciones más grandes, con leading y description por opción y tinte en la seleccionada
variantColorprimary | success | warning | dangerprimaryColor de foco, borde abierto y resaltado de la opción
customColorcolor CSS válido | { light, dark }—Sobrescribe variantColor: pinta foco, borde y resaltado desde un único color, o desde un objeto { light, dark }
sizesm | md | lgmdAltura del botón y de las opciones
radiusnone | sm | md | lg | fullmdRedondeo del botón y del menú
animationnone | smooth | fast | bouncesmoothTransición del menú
disabledbooleanfalseDeshabilita todo el select
namestring—Replica el valor en un <input type="hidden"> para enviarlo en formularios
label / aria-label / id / className / stylestring / string / string / string / CSSProperties—Etiqueta sobre el botón, nombre accesible cuando no hay etiqueta y props de diseño
option.leading / option.descriptionReactNode / string—Slot visual (bandera, icono, avatar) antes del texto y segunda línea por opción. El slot funciona en ambas variantes; la description solo se renderiza con variant="detailed"