Makuco UI
ComponentesData Entry & Selection

Select

Campo de seleção com suporte a seleção simples ou múltipla, opções agrupadas, modo árvore e integração nativa com formulários.

O mk-select é o componente de seleção do Makuco UI. Suporta os modos single e multiple, busca de opções, agrupamento e hierarquia em modo árvore, e integração nativa com formulários via ElementInternals.

Integração com Angular Forms

Para usar com ngModel ou FormControl, importe MkSelectModule em vez de MkSelectComponent. Veja Formulários com Angular.

Seleção simples

import { MkSelect } from '@db1/makuco-ui-react';

const options = [
  { value: 'sp', label: 'São Paulo' },
  { value: 'rj', label: 'Rio de Janeiro' },
  { value: 'mg', label: 'Minas Gerais' },
];

<MkSelect label="Estado" options={options} placeholder="Selecione um estado" />
// component.ts
options = [
  { value: 'sp', label: 'São Paulo' },
  { value: 'rj', label: 'Rio de Janeiro' },
  { value: 'mg', label: 'Minas Gerais' },
];
<mk-select label="Estado" [options]="options" placeholder="Selecione um estado"></mk-select>

Seleção múltipla

Use kind="multiple" para permitir mais de uma seleção. O trigger exibe chips com os valores selecionados e um contador de excedentes.

<MkSelect label="Estados" kind="multiple" options={options} placeholder="Selecione os estados" />
<mk-select label="Estados" kind="multiple" [options]="options"></mk-select>

Com busca

Use searchable para exibir um campo de busca dentro do dropdown que filtra as opções pelo rótulo.

<MkSelect label="Estado" options={options} searchable />
<mk-select label="Estado" [options]="options" searchable></mk-select>

Opções agrupadas

Quando uma opção possui a propriedade items, ela é renderizada como um cabeçalho de grupo — não-selecionável — com seus filhos indentados abaixo. Use para organizar visualmente opções relacionadas sem hierarquia de seleção.

const options = [
  {
    value: 'sudeste',
    label: 'Sudeste',
    items: [
      { value: 'sp', label: 'São Paulo' },
      { value: 'rj', label: 'Rio de Janeiro' },
    ],
  },
  {
    value: 'sul',
    label: 'Sul',
    items: [
      { value: 'rs', label: 'Rio Grande do Sul' },
      { value: 'sc', label: 'Santa Catarina' },
    ],
  },
];

<MkSelect label="Estado" options={options} />
<mk-select label="Estado" [options]="options"></mk-select>

Modo árvore

Com tree, opções que possuem items tornam-se pais selecionáveis com filhos indentados. Em kind="multiple", clicar em um pai seleciona ou desmarca todos os filhos habilitados de uma só vez.

const options = [
  {
    value: 'sudeste',
    label: 'Sudeste',
    items: [
      { value: 'sp', label: 'São Paulo' },
      { value: 'rj', label: 'Rio de Janeiro' },
    ],
  },
  {
    value: 'sul',
    label: 'Sul',
    items: [
      { value: 'rs', label: 'Rio Grande do Sul' },
      { value: 'sc', label: 'Santa Catarina' },
    ],
  },
];

<MkSelect label="Estados" kind="multiple" options={options} tree />
<mk-select label="Estados" kind="multiple" [options]="options" tree></mk-select>

Aninhamento profundo

Quando a hierarquia tem 3 ou mais níveis, combine tree com searchable para facilitar a navegação. O componente aplica indentação automática a cada nível e gerencia aria-level em cada opção.

const options = [
  {
    value: 'brasil',
    label: 'Brasil',
    items: [
      {
        value: 'br-sudeste',
        label: 'Sudeste',
        items: [
          { value: 'sp', label: 'São Paulo' },
          { value: 'rj', label: 'Rio de Janeiro' },
        ],
      },
      {
        value: 'br-sul',
        label: 'Sul',
        items: [
          { value: 'rs', label: 'Rio Grande do Sul' },
          { value: 'pr', label: 'Paraná' },
        ],
      },
    ],
  },
];

<MkSelect
  label="Local"
  options={options}
  tree
  searchable
  kind="multiple"
  allowSelectAll
  placeholder="Selecione locais"
/>
options = [
  {
    value: 'brasil',
    label: 'Brasil',
    items: [
      {
        value: 'br-sudeste',
        label: 'Sudeste',
        items: [
          { value: 'sp', label: 'São Paulo' },
          { value: 'rj', label: 'Rio de Janeiro' },
        ],
      },
    ],
  },
];
<mk-select
  label="Local"
  [options]="options"
  tree
  searchable
  kind="multiple"
  [allow-select-all]="true"
  placeholder="Selecione locais"
></mk-select>

Selecionar tudo

Use allowSelectAll junto com kind="multiple" para exibir a opção "Selecionar tudo" no topo da lista. Ao clicar, todas as opções habilitadas são selecionadas ou desmarcadas.

<MkSelect label="Estados" kind="multiple" options={options} allowSelectAll />
<mk-select label="Estados" kind="multiple" [options]="options" allow-select-all></mk-select>

Texto de ajuda

<MkSelect label="Estado" options={options} supportText="Escolha o estado de entrega" />
<mk-select label="Estado" [options]="options" helper-text="Escolha o estado de entrega"></mk-select>

Estado de erro

Use errorMessage para ativar o estado de erro com uma mensagem exibida abaixo do campo.

<MkSelect label="Estado" options={options} errorMessage="Selecione uma opção" />
<mk-select label="Estado" [options]="options" error-message="Selecione uma opção"></mk-select>

Desabilitado e somente leitura

<MkSelect label="Estado" options={options} disabled />
<MkSelect label="Estado" options={options} readonly />
<mk-select label="Estado" [options]="options" [disabled]="true"></mk-select>
<mk-select label="Estado" [options]="options" [readonly]="true"></mk-select>

Formulários

O mk-select é form-associated. Para seleção múltipla, cada valor selecionado é registrado individualmente no FormData.

<form onSubmit={handleSubmit}>
  <MkSelect label="Estado" name="estado" options={options} required />
  <MkButton type="submit">Enviar</MkButton>
</form>
<form (ngSubmit)="handleSubmit()">
  <mk-select label="Estado" name="estado" [options]="options" required></mk-select>
  <mk-button type="submit">Enviar</mk-button>
</form>

Props

PropTipoPadrãoDescrição
labelstringTexto do rótulo exibido acima do campo. Obrigatório.
optionsSelectOption[][]Lista de opções. Veja a tabela SelectOption abaixo.
kind"single" \| "multiple""single"Modo de seleção — única ou múltipla.
valueunknown \| unknown[]Valor(es) selecionado(s). Use array para kind="multiple". Comparação por referência (===).
placeholderstringTexto exibido quando nenhuma opção está selecionada.
treebooleanfalseAtiva o modo hierárquico. Opções com items tornam-se pais selecionáveis com filhos indentados. Em kind="multiple", clicar no pai seleciona/desmarca todos os filhos habilitados.
searchablebooleanfalseExibe campo de busca dentro do dropdown para filtrar opções pelo rótulo.
allowSelectAllbooleanfalseExibe a opção "Selecionar tudo" no topo da lista. Apenas para kind="multiple".
clearablebooleantrueExibe um botão para limpar a seleção quando há valor. Defina false para remover essa opção.
requiredbooleanfalseMarca o campo como obrigatório com asterisco no rótulo.
disabledbooleanfalseDesabilita o campo, impedindo qualquer interação.
readonlybooleanfalseExibe o valor mas impede abertura do dropdown.
errorMessagestringMensagem de erro exibida abaixo do campo. Ativa o estado inválido quando definida.
supportTextstringTexto auxiliar exibido abaixo do campo quando não há erro.
optionValuestring"value"Chave do objeto de opção usada como valor selecionado.
optionLabelstring"label"Chave do objeto de opção usada como rótulo exibido.
namestringAtributo name para envio em formulários.
requiredMessagestring"Please select an option"Mensagem de validação nativa exibida quando o campo é obrigatório e está vazio.
openbooleanfalseEstado do dropdown. Pode ser definido externamente para abrir/fechar programaticamente.
localestringTag BCP 47 para resolver mensagens i18n. Recai para lang do ancestral e depois pt-BR.

SelectOption

CampoTipoDescrição
valueunknownValor da opção. Obrigatório.
labelstringRótulo exibido na lista. Obrigatório.
disabledbooleanDesabilita a opção individualmente.
descriptionstringTexto secundário exibido abaixo do rótulo.
avatar\{ label?: string; src?: string \}Exibe um avatar à esquerda da opção.
itemsSelectOption[]Sub-itens. Sem tree: a opção pai vira cabeçalho de grupo (não-selecionável). Com tree: a opção pai é selecionável e os filhos ficam indentados.

Eventos

EventoPayloadDescrição
mkChange{ value: unknown \| unknown[] }Emitido sempre que a seleção muda.
mkOpenvoidEmitido quando o dropdown abre.
mkClosevoidEmitido quando o dropdown fecha.

Acessibilidade

  • O trigger usa role="combobox" com aria-expanded, aria-haspopup="listbox" e aria-controls apontando para o listbox.
  • O dropdown usa role="listbox" com aria-multiselectable para o modo multiple.
  • Cada opção usa role="option" com aria-selected e aria-disabled.
  • No modo árvore, filhos recebem aria-level="2".
  • Navegação por teclado: ArrowUp / ArrowDown movem o foco entre opções; Enter ou Space selecionam; Escape fecha.
  • delegatesFocus: true garante que o foco seja delegado ao trigger ao clicar no host.

On this page