Skip to content
Extensões

Popup

Overlay flutuante leve posicionado relativo a um trigger. Diferente do Modal (bloqueante, centralizado) e do Tooltip (passivo, sem interação), o popup permite conteúdo interativo e fecha ao clicar fora. Dark mode automático via variáveis semânticas.

components/popup.csscomponents/popup.jsAbrir no Figma

Uso

Quando e como utilizar cada variante e posição do popup.

  • Bottom (padrão) — Contexto adicional abaixo de um botão ou campo.
  • Top — Quando o espaço abaixo do trigger é insuficiente.
  • Left / Right — Popups laterais para informações complementares em tabelas ou listas.
  • Small — Mensagens curtas ou ações rápidas com pouco conteúdo.
  • Large — Formulários inline ou conteúdo rico com mais espaço.
Não use popup para ações destrutivas ou confirmações críticas. Nesses casos, prefira o Modal, que impede a interação com o restante da página enquanto o diálogo estiver aberto.

Exemplos

Veja abaixo os exemplos interativos do popup com todas as suas posições e variações.

Carregando exemplo...

Anatomia

Estrutura interna do componente e seus elementos.

ParteElementoDescrição
Wrapper.popup-wrapperContainer relativo que engloba trigger e popup
Container.popupO painel flutuante; recebe o modificador de posição
Seta.popup__arrowPseudo-elemento triangular que aponta ao trigger
Conteúdo.popup__contentÁrea de conteúdo com padding interno
Header.popup__headerLinha opcional com título e botão de fechar
Título.popup__titleTexto do título, Inter 14px w600
Fechar.popup__closeBotão ícone no canto superior direito
Rodapé.popup__footerÁrea de ações, separada por borda superior

Propriedades

Classes, estados e atributos disponíveis para configurar o popup.

PropriedadeTipoDefaultDescrição
.popupclasseContainer principal do popup flutuante.
.popup__contentclasseÁrea de conteúdo interno do popup.
.popup__headerclasseCabeçalho opcional com título e botão de fechar.
.popup__titleclasseTítulo do popup, Inter 14px w600.
.popup__closeclasseBotão de fechar posicionado no header.
.popup__footerclasseRodapé opcional para ações.
.popup__arrowclasseSeta apontando para o trigger (pseudo-elemento).
.popup-wrapperclasseWrapper de posicionamento relativo ao trigger.
.popup--topclassePosiciona o popup acima do trigger.
.popup--bottomclassePosiciona o popup abaixo do trigger (padrão).
.popup--leftclassePosiciona o popup à esquerda do trigger.
.popup--rightclassePosiciona o popup à direita do trigger.
.popup--smclasseLargura máxima reduzida: 240px.
.popup--lgclasseLargura máxima ampliada: 480px.
.is-openestadoTorna o popup visível (adicionada via JS).
data-arenito="popup"atributoInicializa o comportamento JS automaticamente.
data-popup-targetatributoSelector do popup que o trigger controla.

Código

Snippets prontos para copiar e usar no seu projeto.

html
<div class="popup-wrapper">
  <button class="btn btn-secondary"
          data-arenito="popup"
          data-popup-target="#popup-info">
    Mais informações
  </button>

  <div class="popup popup--bottom" id="popup-info" role="dialog" aria-modal="true">
    <div class="popup__arrow"></div>
    <div class="popup__content">
      <p>Conteúdo contextual do popup.</p>
    </div>
  </div>
</div>
html
<div class="popup-wrapper">
  <button class="btn btn-secondary"
          data-arenito="popup"
          data-popup-target="#popup-acoes">
    Opções
  </button>

  <div class="popup popup--bottom" id="popup-acoes" role="dialog" aria-modal="true">
    <div class="popup__arrow"></div>
    <div class="popup__header">
      <span class="popup__title">Opções de exportação</span>
      <button class="popup__close" aria-label="Fechar">
        <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"
          viewBox="0 0 48 48" fill="none" stroke="currentColor"
          stroke-width="3" stroke-linecap="round">
          <path d="M8 8L40 40"/>
          <path d="M8 40L40 8"/>
        </svg>
      </button>
    </div>
    <div class="popup__content">
      <p>Escolha o formato de exportação do relatório.</p>
    </div>
    <div class="popup__footer">
      <button class="btn btn-sm btn-outline">Cancelar</button>
      <button class="btn btn-sm btn-primary">Exportar PDF</button>
    </div>
  </div>
</div>

Posicionamento lateral

html
<!-- À direita do trigger -->
<div class="popup-wrapper">
  <button class="btn btn-ghost" data-arenito="popup" data-popup-target="#popup-lateral">
    Ajuda
  </button>
  <div class="popup popup--right" id="popup-lateral" role="dialog">
    <div class="popup__arrow"></div>
    <div class="popup__content">
      <p>Dica contextual de preenchimento.</p>
    </div>
  </div>
</div>

Inicialização programática

javascript
import { initPopup, openPopup, closePopup } from './components/popup.js';

// Inicializar manualmente
const popup = initPopup(document.getElementById('popup-info'));

// Abrir e fechar via JS
openPopup(document.getElementById('popup-info'));
closePopup(document.getElementById('popup-info'));

Eventos

Eventos customizados disparados pelo componente.

javascript
const popupEl = document.getElementById('popup-info');

popupEl.addEventListener('arenito:popup:open', (e) => {
  console.log('Popup aberto', e.detail.popup);
});

popupEl.addEventListener('arenito:popup:close', (e) => {
  console.log('Popup fechado', e.detail.popup);
});
EventoDescriçãodetail
arenito:popup:openDisparado ao abrir o popup{ popup }
arenito:popup:closeDisparado ao fechar o popup{ popup }

Design

Especificações visuais e tokens utilizados no componente.

Especificações

PropriedadeValor
max-width padrão320px
max-width --sm240px
max-width --lg480px
border-radius8px
padding (conteúdo)16px
padding (header/footer)12px 16px
z-index1100
Sombra0 4px 16px rgba(0,0,0,0.12)
Animaçãofade + translateY 4px, 150ms ease

Tokens utilizados

ElementoToken
Fundo--surface-overlay-neutral-container-default
Borda--border-overlay-neutral-default
Título--text-overlay-neutral-default
Conteúdo--text-overlay-neutral-secondary
Seta (fundo)--surface-overlay-neutral-container-default
Seta (borda)--border-overlay-neutral-default
Rodapé (borda)--border-overlay-neutral-default

Design System interno do GALES