Skip to content

MeMultipleSelect

Select de seleção múltipla com suporte a checkboxes, busca por texto, limpeza de seleção, badges nas opções e navegação por teclado.

Playground

Importação

vue
<script setup>
import { MeMultipleSelect } from '@me/ui-vue3'
</script>

Uso Básico

vue
<script setup>
import { ref } from 'vue'

const values = ref([])
const options = [
  { text: 'Opção 1', value: 1 },
  { text: 'Opção 2', value: 2 },
  { text: 'Opção 3', value: 3 },
]
</script>

<template>
  <MeMultipleSelect v-model="values" :options="options" />
</template>

Com Label

Use a prop label para exibir um rótulo acima do select.

vue
<MeMultipleSelect
  v-model="values"
  label="Categorias"
  :options="options"
/>

Clearable

Adiciona um botão de limpeza quando há itens selecionados. Emite @clear ao limpar.

vue
<MeMultipleSelect
  v-model="values"
  :options="options"
  clearable
  @clear="onClear"
/>

Searchable

Exibe um campo de busca ao abrir o dropdown. A busca ignora acentos e é case-insensitive.

vue
<MeMultipleSelect
  v-model="values"
  :options="states"
  searchable
  placeholder="Buscar estado..."
/>

Sem Checkboxes

Use :show-checkboxes="false" para uma lista mais compacta, sem os marcadores de seleção.

vue
<!-- Com checkboxes (padrão) -->
<MeMultipleSelect v-model="values" :options="options" />

<!-- Sem checkboxes -->
<MeMultipleSelect v-model="values" :options="options" :show-checkboxes="false" />

Com Badges

Adicione tag a uma opção para exibir um badge ao lado do texto.

vue
<script setup>
const options = [
  { text: 'Ativo',    value: 'active',   tag: { message: 'Novo',    variant: 'green'  } },
  { text: 'Pendente', value: 'pending',  tag: { message: 'Atenção', variant: 'orange' } },
  { text: 'Inativo',  value: 'inactive', tag: { message: 'Inativo', variant: 'gray'   } },
]
</script>

<template>
  <MeMultipleSelect v-model="values" :options="options" />
</template>

Opções Desabilitadas

Defina disabled: true em uma opção para torná-la não selecionável.

vue
<script setup>
const options = [
  { text: 'Disponível',   value: 1 },
  { text: 'Indisponível', value: 2, disabled: true },
  { text: 'Disponível 2', value: 3 },
]
</script>

<template>
  <MeMultipleSelect v-model="values" :options="options" />
</template>

Disabled

vue
<MeMultipleSelect
  v-model="values"
  :options="options"
  disabled
/>

Eventos

Último evento: Nenhum

vue
<script setup>
import { ref } from 'vue'

const values = ref([])
const lastEvent = ref('Nenhum')
</script>

<template>
  <MeMultipleSelect
    v-model="values"
    :options="options"
    clearable
    @change="(vals) => lastEvent = `change: [${vals.join(', ')}]`"
    @open="lastEvent = 'open'"
    @close="lastEvent = 'close'"
    @clear="lastEvent = 'clear'"
  />
  <p>Último evento: <strong>{{ lastEvent }}</strong></p>
</template>

API

Props

PropTipoPadrãoDescrição
modelValue(string | number)[][]Valores selecionados — use com v-model
optionsOptionSingleSelectType[][]Lista de opções disponíveis
placeholderstring'Selecione'Texto exibido quando nenhum item está selecionado
labelstringundefinedTexto do label exibido acima do select
disabledbooleanfalseDesabilita o select
searchablebooleanfalseHabilita campo de busca/filtro nas opções
clearablebooleanfalseExibe botão para limpar toda a seleção
showCheckboxesbooleantrueExibe checkboxes ao lado das opções
openDirection'down' | 'up''down'Direção de abertura do dropdown

Tipo das Opções

typescript
type OptionSingleSelectType = {
  text: string                    // Texto exibido na lista
  value: string | number | null   // Valor emitido no v-model
  disabled?: boolean              // Desabilita a opção
  params?: unknown                // Dados extras opcionais
  tag?: {                         // Badge ao lado do texto
    message: string
    variant: string               // 'green' | 'orange' | 'gray' | ...
  }
}

Eventos

EventoPayloadDescrição
update:modelValue(string | number)[]Emitido ao selecionar/desselecionar — use com v-model
change(string | number)[]Emitido após qualquer alteração na seleção
clearEmitido ao limpar toda a seleção
openEmitido ao abrir o dropdown
closeEmitido ao fechar o dropdown
focusEmitido ao focar o componente
blurEmitido ao perder o foco
inputChangestring | (string | number)[]Emitido ao digitar na busca ou ao limpar a seleção

Acessibilidade

  • Implementa o padrão WAI-ARIA Combobox com role="combobox", role="listbox" e role="option"
  • aria-multiselectable="true" indica ao leitor de tela que múltiplas opções podem ser selecionadas
  • aria-expanded reflete o estado do dropdown
  • aria-activedescendant aponta para o item com foco no teclado
  • Opções desabilitadas têm aria-disabled="true"
TeclaAção
Enter / SpaceAbre/fecha o dropdown ou seleciona/deseleciona o item focado
ArrowDownMove o foco para a próxima opção (pula desabilitadas)
ArrowUpMove o foco para a opção anterior (pula desabilitadas)
EscapeFecha o dropdown e devolve o foco ao trigger
TabFecha o dropdown e avança o foco

Posicionamento inteligente

O MeMultipleSelect detecta automaticamente o espaço disponível na viewport e abre para cima quando não há espaço suficiente abaixo. Use :open-direction="'up'" para forçar sempre para cima.