Skip to main content

SelectAutocomplete

Campo de seleção com funcionalidade de autocomplete que permite ao usuário filtrar opções digitando no campo de entrada.

Importação

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

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

import { SelectAutocomplete } 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 <SelectAutocomplete {...props} />;
};

Playground Interativo

Explore o componente SelectAutocomplete no playground interativo do Storybook:

Documentação Completa

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

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

<SelectAutocomplete
label="País"
placeholder="Digite para buscar..."
options={[
{ value: 'br', label: 'Brasil' },
{ value: 'us', label: 'Estados Unidos' },
{ value: 'ca', label: 'Canadá' },
{ value: 'mx', label: 'México' },
]}
onChange={(option) => console.log('Selecionado:', option)}
/>

Estados

O componente suporta diferentes estados visuais:

Estados disponíveis

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

Opções Desabilitadas

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

Conjunto Grande de Dados

O componente é ideal para trabalhar com listas grandes de opções:

Exemplos de Uso

SelectAutocomplete Controlado

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

const countries = [
{ value: 'br', label: 'Brasil' },
{ value: 'us', label: 'Estados Unidos' },
{ value: 'ca', label: 'Canadá' },
{ value: 'mx', label: 'México' },
{ value: 'ar', label: 'Argentina' },
// ... mais países
];

return (
<SelectAutocomplete
label="País"
placeholder="Digite para buscar..."
value={selectedCountry}
options={countries}
onChange={(option) => setSelectedCountry(option.value)}
/>
);

SelectAutocomplete com Estados Brasileiros

const brazilianStates = [
{ value: 'sp', label: 'São Paulo' },
{ value: 'rj', label: 'Rio de Janeiro' },
{ value: 'mg', label: 'Minas Gerais' },
{ value: 'rs', label: 'Rio Grande do Sul' },
{ value: 'pr', label: 'Paraná' },
{ value: 'sc', label: 'Santa Catarina' },
// ... todos os estados
];

return (
<SelectAutocomplete
label="Estado"
placeholder="Digite o nome do estado..."
helperText="Digite algumas letras para filtrar os estados"
options={brazilianStates}
onChange={(option) => console.log('Estado selecionado:', option)}
/>
);

SelectAutocomplete 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}>
<SelectAutocomplete
label="Cidade obrigatória"
placeholder="Digite para buscar cidades..."
value={selectedValue}
options={cities}
error={hasError}
helperText={
hasError ? 'Este campo é obrigatório' : 'Digite para filtrar as cidades'
}
onChange={handleChange}
/>
<Button type="submit">Enviar</Button>
</form>
);

SelectAutocomplete para APIs

const [options, setOptions] = useState([]);
const [loading, setLoading] = useState(false);

const searchCities = async (query) => {
if (query.length < 2) return;

setLoading(true);
try {
const response = await fetch(`/api/cities?q=${query}`);
const cities = await response.json();
setOptions(
cities.map((city) => ({
value: city.id,
label: city.name,
}))
);
} catch (error) {
console.error('Erro ao buscar cidades:', error);
} finally {
setLoading(false);
}
};

return (
<SelectAutocomplete
label="Cidade"
placeholder="Digite para buscar cidades..."
options={options}
disabled={loading}
helperText={loading ? 'Buscando...' : 'Digite pelo menos 2 caracteres'}
onChange={(option) => console.log('Cidade selecionada:', option)}
/>
);

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 no campo de entrada
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 input (onFocus, onBlur, etc.)

Funcionalidades

Filtro Automático

  • Busca case-insensitive: Não diferencia maiúsculas de minúsculas
  • Busca por substring: Encontra correspondências em qualquer parte do label
  • Filtro em tempo real: Atualiza a lista conforme digita
  • Digite: Filtra as opções automaticamente
  • Arrow Up/Down: Navega pelas opções filtradas
  • Enter: Seleciona a opção em destaque
  • Escape: Fecha o menu e limpa o filtro
  • Tab: Move foco para próximo elemento

Comportamento do Input

  • Seleção: Ao selecionar uma opção, o input mostra o label selecionado
  • Edição: Ao começar a digitar, o filtro é ativado
  • Reset: Limpar o input remove a seleção atual

Acessibilidade

  • ✅ Suporte completo a navegação por teclado
  • ✅ Estados de foco visíveis
  • ✅ Atributos ARIA apropriados
  • ✅ Suporte a screen readers
  • ✅ Labels associados corretamente
  • ✅ Feedback sobre resultados da busca
  • ✅ Contraste adequado em todos os estados
TeclaFunção
TabMove foco para o campo
DigiteFiltra opções automaticamente
Arrow Up/DownNavega pelas opções filtradas
EnterSeleciona a opção em destaque
EscapeFecha o menu e limpa filtro
BackspaceRemove caracteres e atualiza filtro

Melhores práticas

✅ Faça

  • Use para listas com mais de 10 opções
  • Forneça placeholder que indique a funcionalidade de busca
  • Use helperText para orientar sobre o filtro
  • Implemente debounce para buscas em APIs
  • Ordene resultados por relevância
  • Limite o número de resultados exibidos

❌ Não faça

  • Não use para poucas opções (prefira Select simples)
  • Não implemente filtro muito restritivo
  • Não ignore estados de loading para buscas em API
  • Não omita feedback sobre resultados da busca
  • Não faça requests a cada caractere digitado

Diferenças do Select

FuncionalidadeSelectSelectAutocomplete
Filtro de opções
Campo de entrada
Melhor paraPoucas opçõesMuitas opções
NavegaçãoApenas tecladoTeclado + digitação
PerformanceMelhorBoa (com muitas opções)

Classes CSS

ClasseDescrição
.ods-select-autocomplete__rootEstilos aplicados ao elemento raiz
.ods-select-autocomplete__arrowEstilos aplicados ao ícone de seta
.ods-select-autocomplete__arrow--upEstilos aplicados quando o menu está aberto
.ods-select-autocomplete__arrow--downEstilos aplicados quando o menu está fechado
.ods-select-autocomplete__arrow--disabledEstilos aplicados no estado desabilitado