Componentes Base (Vuesax 3.x)
Como o Pedbot usa o Vuesax 3.11.1 — variantes adotadas, props padrão e restrições por componente.
5
Grupos
30+
Componentes
3.11.1
Versão Vuesax
vs-*
Prefixo padrão
20+
Componentes usados
Vue 2
Options API only
Form Controls
vs-button
Botão
Componente de botão primário do Pedbot. Usado em todos os formulários, CTAs e ações destrutivas. A cor é controlada pelo CSS variable
--vs-primary.Variantes usadas no Pedbot
filled (default)
border
flat
relief
✓ Usar
color="primary" para ações principaiscolor="danger" para ações destrutivastype="border" para ações secundárias:disabled="loading" durante submissão
✗ Não usar
Cores hex diretas em color propBotões sem
vs-button (ver audit — 23 casos)type="gradient" — não é padrão Pedbotsize="large" — usar size="small" ou default
<!-- Ação principal -->
<vs-button color="primary" type="filled" @click="salvar">
Salvar
</vs-button>
<!-- Ação secundária -->
<vs-button color="primary" type="border" @click="cancelar">
Cancelar
</vs-button>
<!-- Ação destrutiva -->
<vs-button color="danger" type="border" icon="trash-2" icon-pack="feather" @click="excluir">
Excluir
</vs-button>
<!-- Com loading -->
<vs-button color="primary" :disabled="loading" @click="enviar">
<span v-if="!loading">Enviar</span>
<span v-else>Enviando...</span>
</vs-button>
vs-input
Input de Texto
Input principal do Pedbot. Suporte a label flutuante, validação com danger/warning, ícones e slots. Todos os formulários usam
v-model com este componente.
PropTipoUso no Pedbot
labelStringLabel flutuante — sempre usar
v-modelStringBinding bidirecional padrão
val-icon-dangerStringÍcone Feather p/ estado de erro
dangerBooleanEstado de validação inválida
danger-textStringMensagem de erro abaixo do input
iconStringÍcone à direita (Feather pack)
icon-packStringSempre
"feather" no Pedbot
placeholderStringPlaceholder (quando sem label)
<!-- Input padrão com label e validação -->
<vs-input
label="Nome do cliente"
v-model="form.nome"
:danger="errors.nome"
:danger-text="errors.nome"
val-icon-danger="x"
icon="user"
icon-pack="feather"
class="w-full"
/>
<!-- Input de senha com toggle -->
<vs-input
label="Senha"
:type="showPass ? 'text' : 'password'"
v-model="form.senha"
:icon="showPass ? 'eye-off' : 'eye'"
icon-pack="feather"
@icon-click="showPass = !showPass"
icon-no-border
class="w-full"
/>
vs-select
Select / Dropdown
Select Vuesax com suporte a busca, múltipla seleção e opções customizadas via
vs-option. Amplamente usado em filtros e formulários do Pedbot.✓ Usar
autocomplete para listas longas (>10 itens)multiple para seleção de tags/filtroslabel em todo select de formuláriov-model com valor primitivo (String/Number)
✗ Não usar
<select> HTML nativo — usar sempre vs-selectObjetos complexos no v-model sem serializar
vs-select sem vs-option (não renderiza)
<!-- Select simples -->
<vs-select label="Status" v-model="filtro.status" class="w-full">
<vs-option label="Todos" value="">Todos</vs-option>
<vs-option label="Ativo" value="active">Ativo</vs-option>
<vs-option label="Inativo" value="inactive">Inativo</vs-option>
</vs-select>
<!-- Select múltiplo com autocomplete -->
<vs-select
label="Atendentes"
v-model="form.atendentes"
multiple
autocomplete
class="w-full"
>
<vs-option
v-for="u in usuarios"
:key="u.id"
:label="u.nome"
:value="u.id"
>{{ u.nome }}</vs-option>
</vs-select>
vs-checkbox
vs-radio
vs-switch
Seletores booleanos
Checkbox para seleção múltipla, Radio para seleção exclusiva, Switch para toggles on/off. O Pedbot usa predominantemente Switch para configurações e Checkbox em tabelas de seleção.
<!-- Checkbox em lista -->
<vs-checkbox v-model="selecionados" :vs-value="item.id" color="primary">
{{ item.nome }}
</vs-checkbox>
<!-- Radio group -->
<vs-radio v-model="tipo" vs-value="bot" color="primary">Bot de Triagem</vs-radio>
<vs-radio v-model="tipo" vs-value="maria" color="primary">MarIA</vs-radio>
<!-- Switch para configuração (padrão Pedbot) -->
<div class="flex items-center gap-3">
<vs-switch v-model="config.ativo" color="primary" />
<span>{{ config.ativo ? 'Ativo' : 'Inativo' }}</span>
</div>
vs-tabs
Abas
Sistema de abas para organizar conteúdo. Usado extensivamente nas views de configuração (
/configs/*) e em detalhes de entidades. O Pedbot usa predominantemente o estilo padrão (sublinhado ativo).✓ Usar
v-model para controlar aba ativa por índice:vs-icon para ícones Feather nas tabsAgrupar configs por categoria em tabs separadas
alignment="fixed" em modais
✗ Não usar
Mais de 6 abas visíveis (usar sidebar/seções)Conteúdo de aba com mais de 2 scroll pages
color diferente de primary
<vs-tabs v-model="activeTab" color="primary">
<vs-tab label="Geral" vs-icon="settings" vs-icon-pack="feather">
<!-- conteúdo geral -->
</vs-tab>
<vs-tab label="Integrações" vs-icon="link" vs-icon-pack="feather">
<!-- integrações -->
</vs-tab>
<vs-tab label="Permissões" vs-icon="shield" vs-icon-pack="feather">
<!-- permissões -->
</vs-tab>
</vs-tabs>
vs-pagination
Paginação
Paginação padrão de listas e tabelas. O Pedbot tem um wrapper custom
Pagination.vue em cima deste componente para padronizar o comportamento. Preferir o wrapper em vez do componente direto.<!-- Preferir o wrapper Pedbot -->
<pagination
:total="totalPages"
v-model="currentPage"
@change="fetchData"
/>
<!-- Direto (somente quando o wrapper não serve) -->
<vs-pagination
:total="totalPages"
v-model="currentPage"
color="primary"
:max="7"
/>
Overlay
vs-dialog
Modal / Dialog
Dialog/modal para confirmações, formulários inline e popups de detalhe. Z-index controlado pelo Vuesax internamente (530,001 — maior z do sistema). O Pedbot usa predominantemente largura média (600–900px).
✓ Usar
vs-dialog para confirmações de ação:vs-accept e :vs-cancel para açõesstyle="z-index:99999" quando sobreposto a outro dialogFechar programaticamente com
v-model
✗ Não usar
<div class="modal"> — reimplementar modal é anti-patternDialogs aninhados mais de 2 níveis
fullscreen — preferir vs-sidebar para mobile
<!-- Dialog de confirmação -->
<vs-dialog
v-model="showConfirmDelete"
title="Confirmar exclusão"
:vs-accept="confirmarExclusao"
vs-accept-text="Excluir"
vs-cancel-text="Cancelar"
color="danger"
>
<p>Tem certeza que deseja excluir <strong>{{ item.nome }}</strong>?</p>
</vs-dialog>
<!-- Dialog com formulário (usando slots) -->
<vs-dialog
v-model="showForm"
title="Novo cliente"
style="width: 720px;"
:vs-accept="salvar"
>
<div slot="header">
<h3>Novo cliente</h3>
</div>
<!-- form content here -->
</vs-dialog>
vs-dropdown
Dropdown
Dropdown de ações contextuais. O Pedbot tem o wrapper
VsDropdownCustom que corrige comportamentos de z-index e posicionamento. Preferir o wrapper.<!-- Usando wrapper Pedbot (preferido) -->
<vs-dropdown-custom vs-trigger-click>
<vs-button type="flat" icon="more-vertical" icon-pack="feather" />
<vs-dropdown-menu>
<vs-dropdown-item @click="editar">
<feather-icon icon="edit-2" svgClasses="h-4 w-4 mr-2" />
Editar
</vs-dropdown-item>
<vs-dropdown-item divider />
<vs-dropdown-item class="text-danger" @click="excluir">
<feather-icon icon="trash-2" svgClasses="h-4 w-4 mr-2" />
Excluir
</vs-dropdown-item>
</vs-dropdown-menu>
</vs-dropdown-custom>
vs-tooltip
Tooltip
Tooltip padrão para textos de ajuda e labels de ícones. O Pedbot tem dois wrappers:
NewTooltip (preferido, HTML rico) e VxTooltip (legado). Usar o componente nativo v-tooltip para casos simples.<!-- Tooltip simples via diretiva -->
<vs-button
v-tooltip="'Copiar link'"
icon="copy"
icon-pack="feather"
type="flat"
/>
<!-- Tooltip com posição -->
<feather-icon
icon="info"
v-tooltip.top="'Este campo é obrigatório para emissão de nota fiscal'"
svgClasses="h-4 w-4 text-grey"
/>
<!-- NewTooltip (HTML rico) -->
<new-tooltip :title="'Histórico'" position="top">
<template #content>
<p>Exibe o histórico completo de <strong>alterações</strong></p>
</template>
<vs-button type="flat" icon="clock" icon-pack="feather" />
</new-tooltip>
vs-alert
Alerta inline
Banner de alerta inline para avisos contextuais dentro de formulários e cards. Não confundir com
vs-notification (toast global).<!-- Alerta de aviso -->
<vs-alert color="warning" icon="alert-triangle" icon-pack="feather" :active="true">
Esta ação não pode ser desfeita.
</vs-alert>
<!-- Alerta de info com title -->
<vs-alert color="primary" icon="info" icon-pack="feather" :active="mostrarInfo" title="Atenção">
O bot só responde em dias úteis, das 8h às 18h.
</vs-alert>
Data Display
vs-card
Card
Card base do Vuesax. O Pedbot o usa raramente diretamente — a maioria dos cards usa o wrapper
VxCard que adiciona header com título, collapse e ações. Usar vs-card direto apenas para cards de conteúdo simples sem título.<!-- Raramente usado direto — preferir VxCard -->
<vs-card>
<div slot="header">
<h4>Resumo</h4>
</div>
<p>Conteúdo do card...</p>
</vs-card>
<!-- Preferido: wrapper VxCard -->
<vx-card title="Resumo" :collapsible="true">
<p>Conteúdo do card...</p>
</vx-card>
vs-table
Tabela base
Tabela base do Vuesax. O Pedbot usa predominantemente o wrapper
VxTable (que corrige comportamentos de sort e expansão). Para listas simples, pode usar vs-table direto com vs-th, vs-tr, vs-td.<!-- Tabela com VxTable (preferido para listas maiores) -->
<vx-table :data="pedidos" search stripe>
<template #thead>
<vs-th sort-key="id">ID</vs-th>
<vs-th sort-key="cliente">Cliente</vs-th>
<vs-th sort-key="total">Total</vs-th>
<vs-th>Ações</vs-th>
</template>
<template #default="{ data }">
<vs-tr v-for="row in data" :key="row.id">
<vs-td>{{ row.id }}</vs-td>
<vs-td>{{ row.cliente }}</vs-td>
<vs-td>R$ {{ row.total }}</vs-td>
<vs-td><!-- ações --></vs-td>
</vs-tr>
</template>
</vx-table>
vs-chip
Chip / Tag
Chip para badges de status, tags de categoria e labels visuais. O Pedbot tem também o componente custom
TagComponent para tags editáveis. Usar vs-chip para display e TagComponent para input de tags.
color="primary"
color="success"
color="warning"
color="danger"
color="dark"
<!-- Status badges -->
<vs-chip color="success" size="small">Ativo</vs-chip>
<vs-chip color="danger" size="small">Inativo</vs-chip>
<vs-chip color="warning" size="small">Pendente</vs-chip>
<!-- Chip removível (input de tags) -->
<vs-chip
v-for="tag in tags"
:key="tag"
@click="removerTag(tag)"
closable
color="primary"
>{{ tag }}</vs-chip>
vs-avatar
Avatar
Avatar de usuário/entidade. Usado no chat de atendimento, navbar e listas de usuários. Suporte a imagem, iniciais e ícone.
<!-- Avatar com imagem -->
<vs-avatar :src="usuario.foto" size="36px" />
<!-- Avatar com iniciais (fallback) -->
<vs-avatar
:text="usuario.nome ? usuario.nome.charAt(0) : 'U'"
size="36px"
color="primary"
/>
<!-- Avatar em lista de chat -->
<vs-avatar
:src="conversa.clienteFoto"
:text="conversa.clienteNome.charAt(0)"
size="42px"
:badge-color="conversa.online ? 'success' : 'grey'"
badge
/>
Feedback
$vs.notify()
Notificação Toast
Toast global para feedback de operações. Chamado via
this.$vs.notify() — não é um componente declarativo mas uma função imperativa. Padrão no Pedbot para confirmação de saves, erros de API e avisos.✓ Usar sempre após
Save bem-sucedido de formulárioErro de requisição API/GraphQL
Operação assíncrona concluída
Ação destrutiva executada (excluir, etc.)
✗ Não usar para
Validação de campo (usar danger-text)Informações estáticas (usar
vs-alert)Múltiplos notifies seguidos (>1 por ação)
// Sucesso
this.$vs.notify({
title: 'Salvo!',
text: 'Configurações atualizadas com sucesso.',
color: 'success',
iconPack: 'feather',
icon: 'icon-check',
position: 'top-right'
})
// Erro
this.$vs.notify({
title: 'Erro ao salvar',
text: error.message || 'Tente novamente.',
color: 'danger',
iconPack: 'feather',
icon: 'icon-x',
position: 'top-right'
})
// Warning
this.$vs.notify({
title: 'Atenção',
text: 'Limite de mensagens atingido.',
color: 'warning',
iconPack: 'feather',
icon: 'icon-alert-triangle',
position: 'top-right'
})
$vs.loading()
Loading global
Overlay de loading global para operações pesadas (navegação entre páginas, carregamento inicial de dados). Para loading inline em componentes, preferir
vs-button :disabled ou skeleton local.// Abrir loading global
this.$vs.loading()
// Fechar
this.$vs.loading.close()
// Loading em container específico
this.$vs.loading({ container: this.$refs.minhaDiv, scale: 0.6 })
this.$vs.loading.close(this.$refs.minhaDiv._loaders[0])