NewTooltip

src/components/new-tooltip/NewTooltip.vue (interno: CustomTooltip)
Overlay Medium 9 usos

Tooltip customizado com posicionamento via portal (document.body). Usa getBoundingClientRect() para coordenadas fixas — não sofre clipping por overflow:hidden do pai. Suporta 4 posições (top/bottom/left/right), seta triangular CSS, e transição de opacidade. Usado exclusivamente no chat de atendimento. Diferente do VxTooltip (Vuesax) — este é um componente custom com pill escuro (#374151).

4 Posições

Todas as 4 posições disponíveis. position="top" é o padrão e dominante (>80% dos usos). position="bottom" nunca foi encontrado no admin real.

Recarregar
position="top"
★ padrão
Mais informações
position="bottom"
nunca usado
Selecionar
position="left"
Kanban Pedidos
position="right"
sidebar nav
Real src/views/chat-attendance/Index.vue:452
<!-- position="top" (padrão e mais usado) -->
<NewTooltip text="Recarregar" position="top">
  <vs-button
    type="filled"
    icon="refresh"
    class="ml-2"
    :disabled="lockRefresh"
    @click="refreshAttendances"
  />
</NewTooltip>

<!-- position="right" — sidebar de plataforma -->
<NewTooltip v-if="hasMaria" text="Kanban Pedidos" position="right" class="d-inline-block">
  <button type="button" class="chat-platform-navbar__icon" @click="selectPlatform('kanban')">
    <vs-icon iconPack="material-icons" icon="view_column" />
  </button>
</NewTooltip>

<!-- position="left" -->
<NewTooltip text="Selecionar Atendimento" position="left">
  <vs-button type="filled" icon="check_circle" icon-pack="material-icons" @click="toggleSelectList" />
</NewTooltip>

<!-- Exemplo sintético — position="bottom" sem uso real encontrado -->
<NewTooltip text="Mais informações" position="bottom">
  <feather-icon icon="InfoIcon" svgClasses="w-5 h-5 stroke-current" />
</NewTooltip>

Comportamento Portal

O tooltip é teleportado para .custom-tooltip-portal no document.body — evita clipping por overflow:hidden do componente pai. Coordenadas calculadas via getBoundingClientRect() do trigger, com posição fixed e gap de 8px.

ParentComponent (pode ter overflow:hidden)
<NewTooltip text="..." position="top">
  <button>Trigger</button>
</NewTooltip>
↓ mounted() / mouseenter
document.body
<div class="custom-tooltip-portal" style="position:fixed; inset:0; pointer-events:none; z-index:999998">
  <div class="custom-tooltip custom-tooltip--visible">...</div>
</div>
Cleanup: beforeDestroy remove o tooltip do portal se ainda estiver lá.

API

<!-- text: obrigatório. position: 'top'|'bottom'|'left'|'right' -->
<NewTooltip text="Descrição da ação" position="top">
  <!-- Trigger: qualquer elemento — hover/focus mostra o tooltip -->
  <feather-icon icon="HelpCircleIcon" svgClasses="w-4 h-4" />
</NewTooltip>

Props

NomeTipoDefaultObrig.Descrição
text String Sim Texto do tooltip. Max-width 280px, quebra linha automaticamente.
position String "top" Não Posição em relação ao trigger. Valores: 'top', 'bottom', 'left', 'right'. Validado com validator.

Slots

SlotDescrição
default Elemento trigger — qualquer conteúdo. hover/focusin mostra o tooltip; mouseleave/focusout esconde.

CSS — Valores internos

PropriedadeValor
Background#374151 (cinza escuro — não usa var(--dark))
Color#fff
Padding10px 14px
Border-radius8px
Font-size13px / font-weight 500
Max-width280px
Box-shadow0 4px 12px rgba(0,0,0,0.15)
Transitionopacity 0.15s ease
Arrow size5px (border trick)
Gap trigger8px
z-index999999 (portal: 999998)
Positionfixed (coordenadas via getBoundingClientRect)

Onde é usado (9 usos — todos em chat-attendance)

src/views/chat-attendance/Index.vue
src/views/chat-attendance/UserProfile.vue
src/views/chat-attendance/NewChat.vue
src/views/chat-attendance/NewIndex.vue
src/views/chat-attendance/new-chat/NewChatPlatformNavbar.vue