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
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
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
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).
<button sw-btn="suc" sw-toast="ok" sw-toast-msg="Pagamento aprovado!">Aprovar</button>
<button sw-btn="err" sw-toast="err" sw-toast-msg="Não foi possível enviar. Tente de novo.">Falhar</button>
<button sw-btn="ale" sw-toast="ale" sw-toast-msg="Sua sessão expira em 5 minutos.">Avisar</button>
<button sw-btn="inf" sw-toast="inf" sw-toast-msg="Novo relatório disponível.">Informar</button>
<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.
<button sw-btn="suc out" sw-toast="ok" sw-toast-title="Pedido #1042" sw-toast-msg="Saiu para entrega.">Com título</button>
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.
<button sw-btn="out" sw-toast="inf" sw-toast-pos="tl" sw-toast-msg="Apareci em cima, à esquerda.">tl</button>
<button sw-btn="out" sw-toast="inf" sw-toast-pos="tc" sw-toast-msg="Apareci em cima, no centro.">tc</button>
<button sw-btn="out" sw-toast="inf" sw-toast-pos="tr" sw-toast-msg="Apareci em cima, à direita (padrão).">tr</button>
<button sw-btn="out" sw-toast="inf" sw-toast-pos="cl" sw-toast-msg="Apareci no meio, à esquerda.">cl</button>
<button sw-btn="out" sw-toast="inf" sw-toast-pos="cc" sw-toast-msg="Apareci bem no meio.">cc</button>
<button sw-btn="out" sw-toast="inf" sw-toast-pos="cr" sw-toast-msg="Apareci no meio, à direita.">cr</button>
<button sw-btn="out" sw-toast="inf" sw-toast-pos="bl" sw-toast-msg="Apareci embaixo, à esquerda.">bl</button>
<button sw-btn="out" sw-toast="inf" sw-toast-pos="bc" sw-toast-msg="Apareci embaixo, no centro.">bc</button>
<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).
<button sw-btn="out" sw-toast="inf" sw-toast-dur="1500" sw-toast-msg="Link copiado.">1,5 s</button>
<button sw-btn="out" sw-toast="inf" sw-toast-msg="Tempo padrão.">4 s</button>
<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>
<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('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).
SW.Alert.confirmar('Deseja sair sem salvar?', function (ok) {
if (ok) SW.Alert.inf('Você saiu.');
});
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
| Palavra | O que faz | Exemplo |
|---|---|---|
| Por atributo (no botão ou link que dispara) | ||
sw-toast | Liga o aviso no clique e diz o tipo: ok, err, ale, inf, drk. Vazio vira inf. | sw-toast="ok" |
sw-toast-msg | A mensagem. Sem ela, aparece "Mensagem". | sw-toast-msg="Salvo!" |
sw-toast-title | Título acima da mensagem (opcional). | sw-toast-title="Pronto" |
sw-toast-dur | Tempo na tela em milissegundos. Padrão: 4000. 0 = fica até a pessoa clicar. | sw-toast-dur="8000" |
sw-toast-pos | Canto: 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 = 0 | Fica 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.
<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>
<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>
<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>
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?).remove()).SW.Alert.sucesso / .erro / .alerta / .info (mensagem, tempo?, canto?)SW.Alert.confirmar(mensagem, função, título?, ícone?)true/false), não por await.SWAlertSW.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). EscreverSW.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.oksó depois dofetchdar 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.

