Skip to main content

Select

Campo de seleção que permite ao usuário escolher uma opção a partir de uma lista predefinida de valores.

Importação

import { Select } from '@useblu/ocean-react';

Importação específica (recomendado para tree-shaking)

import { Select } from '@useblu/ocean-react/Select';

Importação de tipos TypeScript

import type { SelectProps } from '@useblu/ocean-react';

// Uso em componente customizado
const MyComponent: React.FC<SelectProps> = (props) => {
return <Select {...props} />;
};

Playground Interativo

Explore o componente Select no playground interativo do Storybook:

Documentação Completa

Para documentação técnica detalhada, exemplos de uso e API completa, consulte o Storybook do Select.

No Storybook você encontrará:

  • Controles interativos para testar todas as props
  • API gerada automaticamente com tipagem completa
  • Exemplos visuais de todas as variantes e estados
  • Playground para experimentação rápida

Uso básico

<Select
label="País"
placeholder="Selecione um país..."
options={[
{ value: 'br', label: 'Brasil' },
{ value: 'us', label: 'Estados Unidos' },
{ value: 'ca', label: 'Canadá' },
]}
onChange={(option) => console.log('Selecionado:', option)}
/>

Estados

O componente suporta diferentes estados visuais:

Estados disponíveis

  • Normal: Estado padrão para seleção
  • Com valor selecionado: Quando uma opção já está selecionada
  • Disabled: Quando o campo não está disponível para seleção
  • Error: Quando há erro de validação

Opções Desabilitadas

É possível desabilitar opções específicas dentro do menu:

Muitas Opções

O componente suporta listas longas com scroll interno:

Exemplos de Uso

Select Controlado

const [selectedCountry, setSelectedCountry] = useState('');

const countries = [
{ value: 'br', label: 'Brasil' },
{ value: 'us', label: 'Estados Unidos' },
{ value: 'ca', label: 'Canadá' },
{ value: 'mx', label: 'México' },
];

return (
<Select
label="País"
placeholder="Selecione um país..."
value={selectedCountry}
options={countries}
onChange={(option) => setSelectedCountry(option.value)}
/>
);

Select Não Controlado

const countries = [
{ value: 'br', label: 'Brasil' },
{ value: 'us', label: 'Estados Unidos' },
{ value: 'ca', label: 'Canadá' },
];

return (
<Select
label="País"
placeholder="Selecione um país..."
defaultValue="br"
options={countries}
onChange={(option) => console.log('Selecionado:', option)}
/>
);

Select com Validação

const [selectedValue, setSelectedValue] = useState('');
const [hasError, setHasError] = useState(false);

const handleChange = (option) => {
setSelectedValue(option.value);
setHasError(false);
};

const handleSubmit = () => {
if (!selectedValue) {
setHasError(true);
}
};

return (
<form onSubmit={handleSubmit}>
<Select
label="Categoria obrigatória"
placeholder="Selecione uma categoria..."
value={selectedValue}
options={categories}
error={hasError}
helperText={
hasError ? 'Este campo é obrigatório' : 'Escolha uma categoria'
}
onChange={handleChange}
/>
<Button type="submit">Enviar</Button>
</form>
);

API

Props

PropTipoPadrãoDescrição
optionsOptionType[]-Array de opções que populam o menu (obrigatório)
labelstring-Rótulo do campo de seleção
placeholderstring-Texto exibido quando nenhuma opção está selecionada
valuestring | number-Valor selecionado (modo controlado)
defaultValuestring | number-Valor padrão selecionado (modo não controlado)
onChange(option: OptionType) => void-Callback quando uma opção é selecionada
errorbooleanfalseExibe estilo de erro
disabledbooleanfalseDesabilita o campo
helperTextstring-Texto de ajuda exibido abaixo do campo
idstring-ID do elemento select
namestring-Nome do campo para formulários
ariaLabelstring-Label de acessibilidade
classNamestring-Classes CSS adicionais

OptionType

type OptionType = {
value: string | number;
label: string;
disabled?: boolean;
className?: string;
[propName: string]: any;
};

Eventos

  • onChange: Disparado quando uma opção é selecionada
  • Suporte a eventos padrão de formulário

Funcionalidades

  • Enter/Space: Abre o menu de opções
  • Arrow Up/Down: Navega pelas opções
  • Escape: Fecha o menu
  • Tab: Move foco para próximo elemento

Acessibilidade

  • Suporte completo a ARIA
  • Labels associados corretamente
  • Estados de foco visíveis
  • Navegação por teclado
  • Suporte a screen readers

Acessibilidade

  • ✅ Suporte completo a navegação por teclado
  • ✅ Estados de foco visíveis
  • ✅ Atributos ARIA apropriados
  • ✅ Suporte a screen readers
  • ✅ Labels associados corretamente
  • ✅ Contraste adequado em todos os estados
TeclaFunção
TabMove foco para o campo
Enter / SpaceAbre o menu de opções
Arrow Up/DownNavega pelas opções
EscapeFecha o menu
HomeMove para primeira opção
EndMove para última opção

Melhores práticas

✅ Faça

  • Use labels descritivos e claros
  • Forneça placeholder informativo
  • Ordene opções logicamente (alfabética, por frequência, etc.)
  • Use helperText para orientações adicionais
  • Implemente validação quando necessário
  • Desabilite opções que não estão disponíveis temporariamente

❌ Não faça

  • Não omita o label para acessibilidade
  • Não use muitas opções sem search (considere SelectAutocomplete)
  • Não ignore estados de erro
  • Não use opções com labels muito longas
  • Não implemente validação muito restritiva

Classes CSS

ClasseDescrição
.ods-select__rootEstilos aplicados ao elemento raiz
.ods-select__controlEstilos aplicados ao controle
.ods-select__control--expandedEstilos aplicados quando o menu está aberto
.ods-select__control--filledEstilos aplicados quando há valor selecionado
.ods-select__control--errorEstilos aplicados no estado de erro
.ods-select__valueEstilos aplicados ao valor exibido
.ods-select__arrowEstilos aplicados ao ícone de seta
.ods-select__listboxEstilos aplicados ao menu de opções
.ods-select__optionEstilos aplicados a cada opção
.ods-select__option--selectedEstilos aplicados à opção selecionada
.ods-select__option--disabledEstilos aplicados às opções desabilitadas