JS Module

Custom Select SWSel

Select customizado com busca em tempo real, multi-select com tags, teclado acessível e sincronização total com o <select> nativo.

1. Básico

Envolva o <select> nativo com um div sw-select. O JS oculta o nativo, injeta a UI e mantém os dois sincronizados. Com busca ativada (padrão em seleção única) o próprio campo visível já é o input de busca — clique e comece a digitar direto, sem passo extra. Use sw-select-search="false" para remover a busca.

2. Multi-Select com Tags

Adicione multiple no <select>. Cada item selecionado vira uma tag com botão de remoção - clique no ?- para remover ou selecione o item novamente para desmarcar.

value: ["js", "react"]

3. Estados de Validação

Adicione .is-err ou .is-ok no wrapper para indicar o estado do campo. Normalmente aplicados via JS após validação.

// Aplicar estado via JS
const wrap = document.querySelector('[sw-select]');
wrap.classList.add('is-err');  // ou is-ok
wrap.classList.remove('is-err', 'is-ok');

4. Evento em Tempo Real

sw:select:change é disparado no wrapper a cada seleção. O select nativo também recebe um change padrão - formulários funcionam normalmente.

Selecione um plano para ver o evento...
document.querySelector('[sw-select]')
  .addEventListener('sw:select:change', e => {
    console.log(e.detail.value);  // array com os valores selecionados
    console.log(e.detail.label);  // label do primeiro selecionado
  });

// Select nativo também dispara 'change' normalmente
document.querySelector('[name="plano"]')
  .addEventListener('change', function () {
    console.log(this.value);
  });

Quick Reference

Atributo / Classe Elemento Descrição
sw-select div (wrapper) Ativa o custom select
sw-select-ph="..." select Texto placeholder quando nada está selecionado
sw-select-search="false" select Remove o campo de busca do dropdown
multiple select Ativa multi-seleção com tags removíveis
selected option Pré-seleciona a opção - refletido automaticamente na UI
.is-err div (wrapper) Borda vermelha - estado de erro
.is-ok div (wrapper) Borda verde - estado válido
sw:select:change evento (wrapper) detail.value (array) e detail.label (texto do 1 selecionado)