SW Core
SW Core / JavaScript / Toast (SW.Alert)

Toast (SW.Alert) JavaScript

O aviso que aparece no canto da tela e some sozinho — "Pedido enviado!", "Sem conexão", "Sessão expira em 5 minutos". Também faz a caixa "Tem certeza?".

O que é

É a mensagem rápida que confirma que algo aconteceu, sem tirar a pessoa do que ela estava fazendo. Ela aparece por cima da página, fica alguns segundos com uma barrinha mostrando o tempo, e some. Você dispara de dois jeitos: por atributo num botão (sw-toast="ok" + a mensagem) ou por JavaScript (SW.Alert.ok('Salvo!')) — o segundo é o mais comum, depois de salvar um formulário. O mesmo módulo tem a caixa de confirmação (SW.Alert.confirmar) para ações perigosas.

Precisa do JavaScript do SW Core (o visual vem junto com o script, não precisa de CSS a mais). O ícone de cada tipo é um swi-*, que vem no pacote complementar. Vários avisos seguidos se empilham no mesmo canto. Clicar no aviso (ou no ×) fecha antes da hora. O aviso é sempre escuro e translúcido, então fica legível tanto no tema claro quanto no escuro.

Quando usar

  • Confirmar que deu certo depois de salvar, enviar, copiar: SW.Alert.ok('Dados salvos').
  • Avisar que falhou (sem internet, servidor fora): SW.Alert.err(…).
  • Pedir confirmação antes de excluir ou cancelar: SW.Alert.confirmar(…).
  • Aviso que precisa ficar na tela até a pessoa resolver (ex.: "complete seu cadastro"): use o Alerta (inline), que fica no meio da página.

Comece aqui

  1. 1

    Coloque o SW Core na página. O CSS complementar traz os ícones do aviso.

    <link rel="stylesheet" href="swcore/swcore.min.css">
    <link rel="stylesheet" href="swcore/swcore.compl.min.css">
    
    <!-- fim do body -->
    <script src="swcore/swcore.min.js"></script>
  2. 2

    Jeito 1 — por atributo: o botão mostra o aviso quando é clicado.

    <button sw-btn="suc" sw-toast="ok" sw-toast-msg="Seu pedido foi enviado!">Enviar pedido</button>
  3. 3

    Jeito 2 — por JavaScript, depois que algo acontece de verdade (ex.: o servidor respondeu).

    <script>
      SW.Alert.ok('Cadastro salvo com sucesso!');
    </script>

Todas as variações

Cada quadro abaixo é o componente de verdade, rodando. O código embaixo é exatamente o que está no quadro: copie e cole.

1. Tipos (cor e ícone)

Cinco tipos, cada um com sua cor de borda, barrinha e ícone. Clique para ver. Por atributo o tipo vai em sw-toast; por JavaScript, é o nome da função (SW.Alert.ok, .err, .ale, .inf, .drk).

ok — deu certo (verde) <button sw-btn="suc" sw-toast="ok" sw-toast-msg="Pagamento aprovado!">Aprovar</button>
err — deu errado (vermelho) <button sw-btn="err" sw-toast="err" sw-toast-msg="Não foi possível enviar. Tente de novo.">Falhar</button>
ale — atenção (amarelo) <button sw-btn="ale" sw-toast="ale" sw-toast-msg="Sua sessão expira em 5 minutos.">Avisar</button>
inf — informação (azul) <button sw-btn="inf" sw-toast="inf" sw-toast-msg="Novo relatório disponível.">Informar</button>
drk — neutro <button sw-btn="drk" sw-toast="drk" sw-toast-msg="Rascunho guardado.">Neutro</button>

2. Com título

O título aparece em letras maiúsculas pequenas, acima da mensagem. Por atributo: sw-toast-title. Por JavaScript: é o 4º valor.

sw-toast-title <button sw-btn="suc out" sw-toast="ok" sw-toast-title="Pedido #1042" sw-toast-msg="Saiu para entrega.">Com título</button>
Por JavaScript: SW.Alert.ok(mensagem, tempo, canto, título) SW.Alert.ok('Saiu para entrega.', 4000, 'tr', 'Pedido #1042');

3. Em que canto aparece

Nove posições: t = em cima, c = centro, b = embaixo, combinado com l = esquerda, c = centro, r = direita. Padrão: tr. Por atributo: sw-toast-pos. Por JavaScript: é o 3º valor.

tl — em cima, à esquerda <button sw-btn="out" sw-toast="inf" sw-toast-pos="tl" sw-toast-msg="Apareci em cima, à esquerda.">tl</button>
tc — em cima, no centro <button sw-btn="out" sw-toast="inf" sw-toast-pos="tc" sw-toast-msg="Apareci em cima, no centro.">tc</button>
tr — em cima, à direita (padrão) <button sw-btn="out" sw-toast="inf" sw-toast-pos="tr" sw-toast-msg="Apareci em cima, à direita (padrão).">tr</button>
cl — no meio, à esquerda <button sw-btn="out" sw-toast="inf" sw-toast-pos="cl" sw-toast-msg="Apareci no meio, à esquerda.">cl</button>
cc — bem no meio <button sw-btn="out" sw-toast="inf" sw-toast-pos="cc" sw-toast-msg="Apareci bem no meio.">cc</button>
cr — no meio, à direita <button sw-btn="out" sw-toast="inf" sw-toast-pos="cr" sw-toast-msg="Apareci no meio, à direita.">cr</button>
bl — embaixo, à esquerda <button sw-btn="out" sw-toast="inf" sw-toast-pos="bl" sw-toast-msg="Apareci embaixo, à esquerda.">bl</button>
bc — embaixo, no centro <button sw-btn="out" sw-toast="inf" sw-toast-pos="bc" sw-toast-msg="Apareci embaixo, no centro.">bc</button>
br — embaixo, à direita <button sw-btn="out" sw-toast="inf" sw-toast-pos="br" sw-toast-msg="Apareci embaixo, à direita.">br</button>

4. Quanto tempo fica na tela

Padrão: 4 segundos (4000 ms). A barrinha embaixo mostra o tempo correndo. Por atributo: sw-toast-dur. Por JavaScript: é o 2º valor. Nos dois, 0 faz o aviso ficar até a pessoa clicar (sem barrinha).

sw-toast-dur="1500" — rapidinho <button sw-btn="out" sw-toast="inf" sw-toast-dur="1500" sw-toast-msg="Link copiado.">1,5 s</button>
Padrão — 4 s <button sw-btn="out" sw-toast="inf" sw-toast-msg="Tempo padrão.">4 s</button>
sw-toast-dur="9000" — mensagem longa <button sw-btn="out" sw-toast="ale" sw-toast-dur="9000" sw-toast-msg="O sistema ficará em manutenção hoje, das 22h às 23h.">9 s</button>
sw-toast-dur="0" — fica até clicar <button sw-btn="out" sw-toast="err" sw-toast-dur="0" sw-toast-msg="Sem conexão com a internet.">Até clicar (atributo)</button>
SW.Alert.err(mensagem, 0) — fica até clicar SW.Alert.err('Sem conexão com a internet.', 0);

5. Caixa de confirmação

SW.Alert.confirmar(mensagem, função, título?, ícone?) abre uma caixa no meio da tela com Confirmar e Cancelar. A resposta chega na função: true se confirmou, false se cancelou, clicou fora ou apertou Esc. O ícone é qualquer swi-* (padrão: swi-help-circle).

Padrão SW.Alert.confirmar('Deseja sair sem salvar?', function (ok) { if (ok) SW.Alert.inf('Você saiu.'); });
Com título e ícone SW.Alert.confirmar( 'O pedido #1042 será excluído e não dá para desfazer.', function (ok) { ok ? SW.Alert.ok('Pedido excluído.') : SW.Alert.drk('Nada foi excluído.'); }, 'Excluir pedido?', // título 'swi-trash' // ícone );

Tabela de opções

PalavraO que fazExemplo
Por atributo (no botão ou link que dispara)
sw-toastLiga o aviso no clique e diz o tipo: ok, err, ale, inf, drk. Vazio vira inf.sw-toast="ok"
sw-toast-msgA mensagem. Sem ela, aparece "Mensagem".sw-toast-msg="Salvo!"
sw-toast-titleTítulo acima da mensagem (opcional).sw-toast-title="Pronto"
sw-toast-durTempo na tela em milissegundos. Padrão: 4000. 0 = fica até a pessoa clicar.sw-toast-dur="8000"
sw-toast-posCanto: tl tc tr cl cc cr bl bc br. Padrão: tr.sw-toast-pos="bc"
Por JavaScript — SW.Alert.tipo(mensagem, tempo?, canto?, título?)
SW.Alert.ok(…)Verde, deu certo.SW.Alert.ok('Salvo!')
SW.Alert.err(…)Vermelho, deu errado.SW.Alert.err('Falhou', 6000)
SW.Alert.ale(…)Amarelo, atenção.SW.Alert.ale('Confira o CEP', 4000, 'bc')
SW.Alert.inf(…)Azul, informação.SW.Alert.inf('Chegou', 4000, 'tr', 'Novidade')
SW.Alert.drk(…)Neutro.SW.Alert.drk('Rascunho guardado')
tempo = 0Fica na tela até a pessoa clicar.SW.Alert.err('Sem conexão', 0)
Nomes em português (sem título)
SW.Alert.sucesso(mensagem, tempo?, canto?)O mesmo que ok.SW.Alert.sucesso('Salvo!')
SW.Alert.erro(…)O mesmo que err.
SW.Alert.alerta(…)O mesmo que ale.
SW.Alert.info(…)O mesmo que inf.
Confirmação
SW.Alert.confirmar(mensagem, função, título?, ícone?)Caixa com Confirmar/Cancelar. A função recebe true ou false. Título padrão: "Confirmação".SW.Alert.confirmar('Excluir?', ok => …)

Receitas prontas — usos reais

Situações que aparecem em quase todo site. Copie a que servir.

Depois de enviar um formulário pelo JavaScript Ao vivo
<form id="contato">
  <input sw-inp type="email" name="email" placeholder="seu@email.com" aria-label="E-mail" required>
  <button sw-btn="pri" type="submit">Quero ser contatado</button>
</form>

<script>
  document.getElementById('contato').addEventListener('submit', async (e) => {
    e.preventDefault();
    try {
      const r = await fetch('/contato', { method: 'POST', body: new FormData(e.target) });
      if (!r.ok) throw new Error();
      SW.Alert.ok('Recebemos seu contato. Respondemos em até 1 dia útil.', 5000, 'tr', 'Mensagem enviada');
      e.target.reset();
    } catch (_) {
      SW.Alert.err('Não foi possível enviar. Tente de novo.');
    }
  });
</script>
Botão "copiar link" com aviso rápido embaixo Ao vivo
<button sw-btn="out" id="copiar"><i class="swi-copy"></i> Copiar link</button>

<script>
  document.getElementById('copiar').addEventListener('click', async () => {
    await navigator.clipboard.writeText(location.href);
    SW.Alert.ok('Link copiado!', 1500, 'bc');
  });
</script>
Confirmar antes de excluir (painel admin) Ao vivo
<button sw-btn="err out" id="excluir"><i class="swi-trash"></i> Excluir cliente</button>

<script>
  document.getElementById('excluir').addEventListener('click', () => {
    SW.Alert.confirmar(
      'O cliente Ana Souza e todo o histórico dela serão apagados.',
      async (ok) => {
        if (!ok) return;
        await fetch('/clientes/12', { method: 'DELETE' });
        SW.Alert.ok('Cliente excluído.');
      },
      'Excluir cliente?',
      'swi-trash'
    );
  });
</script>
Vários seguidos se empilham Ao vivo
SW.Alert.ok('Foto 1 enviada');
SW.Alert.ok('Foto 2 enviada');
SW.Alert.ale('Foto 3 muito grande, ignorada');
// cada um some no seu tempo; os de baixo sobem

API (JavaScript)

SW.Alert.ok / .err / .ale / .inf / .drk (mensagem, tempo?, canto?, título?)
Mostra o aviso. Devolve o elemento do aviso (dá para removê-lo antes: .remove()).
SW.Alert.sucesso / .erro / .alerta / .info (mensagem, tempo?, canto?)
Os mesmos, com nome em português — sem título.
SW.Alert.confirmar(mensagem, função, título?, ícone?)
Caixa de confirmação. A resposta chega na função (true/false), não por await.
SWAlert
Mesmo objeto que SW.Alert, com outro nome (para código antigo).

Precisa de quê

  • swcore.min.js — o visual do aviso vem dentro do próprio script.
  • swcore.compl.min.css — os ícones dos avisos e da confirmação.

Cuidados — erros comuns

  • Ordem dos valores no JavaScript: é (mensagem, tempo, canto, título). Escrever SW.Alert.ok('Salvo', 'Pronto') põe "Pronto" no lugar do tempo — o aviso fica na tela para sempre e o título não aparece. Com título: SW.Alert.ok('Salvo', 4000, 'tr', 'Pronto').
  • Esperar a resposta com await SW.Alert.confirmar(…): não funciona. A resposta chega na função que você passa.
  • Mostrar o "deu certo" antes de o servidor responder: se falhar depois, a pessoa foi enganada. Chame SW.Alert.ok só depois do fetch dar certo.
  • Usar aviso passageiro para erro que a pessoa precisa corrigir num campo: ela não vê a tempo. Mostre o erro junto do campo (ver Validação) e use o aviso só como reforço.

O que ele não faz

  • É passageiro e flutuante. Para aviso fixo dentro da página, use o Alerta (inline).
  • A caixa de confirmação tem sempre os botões "Confirmar" e "Cancelar" — o texto deles não muda.
  • Não tem botão de ação dentro do aviso (ex.: "Desfazer").
  • O visual é sempre escuro translúcido, nos dois temas — não segue a cor primária do site.