mad-toast
Notificações Sonner-style (PHP MadToast::* ou JS).
Notificacoes estilo Sonner — empilhadas, swipe-to-dismiss, auto-dismiss. Disparadas tanto do PHP (via MadResponse / MadToast) quanto do JS (via madToast()).
Setup — incluir UMA vez no layout
O <mad-toast /> registra a regiao de notificacoes (Alpine madToastSystem()). Deve aparecer uma unica vez no layout principal — nunca repetir em paginas/drawers.
{{-- app/templates/theme-notch/... ou layout principal --}}
<body>
...
<mad-toast />
</body>
Sem o <mad-toast /> no layout, nenhum toast renderiza (PHP ou JS).
Tipos
| Tipo | Uso |
|---|---|
success |
Acao concluida com sucesso |
info |
Informacao neutra |
warning |
Atencao / aviso |
danger |
Erro / falha |
Disparar do PHP — MadToast factory (atalho)
Retorna um MadResponse ja com o op de toast — encadeavel.
use Mad\Ui\MadToast;
return MadToast::success('Registro salvo!');
return MadToast::danger('Falha ao salvar.');
return MadToast::warning('Verifique os campos.');
return MadToast::info('Sincronizacao iniciada.');
// Com titulo
return MadToast::success('Pedido aprovado!', 'Sucesso');
// Com titulo e posicao — assinatura:
// MadToast::<tipo>(string $message, string $title = '', string $position = 'top-right')
return MadToast::warning('Sessao expirando', 'Atencao', 'bottom-center');
// Encadeando outras ops
return MadToast::success('Salvo!')
->closeDrawer()
->removeRow($id, MinhaListagem::class);
Disparar do PHP — MadResponse->toast()
Quando ja tem um MadResponse em construcao, usar o metodo direto.
return (new MadResponse())
->toast('Pedido salvo!', 'success')
->closeDrawer();
// Com titulo e posicao
return (new MadResponse())
->toast('Erro de validacao', 'danger', 'Atencao', 'top-center');
Assinatura: toast(string $message, string $type = 'info', string $title = '', string $position = 'top-right')
Posicoes: top-left, top-center, top-right (padrao), bottom-left, bottom-center, bottom-right.
Disparar do JS — madToast()
// Forma curta
madToast('Mensagem salva!', 'success');
madToast('Erro ao salvar.', 'danger', 'Erro', 6000);
// Helpers tipados
madToast.success('Pedido aprovado!');
madToast.danger('Falha na conexao');
madToast.warning('Sessao expirando');
madToast.info('Nova versao disponivel');
// Forma objeto (controle total)
madToast({
message: 'Mensagem',
type: 'success',
title: 'Titulo opcional',
duration: 6000
});
Assinatura: madToast(message, type, title, duration) — duracao default 4000ms.
Padrao de uso em forms
public function onSave(): MadResponse
{
try {
$this->form->validate(MeuModelo::rules($this->registroId));
DB::connection('business')->transaction(function () {
$registro = MeuModelo::findOrNew($this->registroId);
$this->form->save($registro);
$this->registroId = (int) $registro->id;
});
return (new MadResponse())
->toast('Salvo!', 'success')
->closeDrawer();
} catch (MadValidationException $e) {
return $e->asModal();
} catch (Throwable $e) {
return MadMessage::error('Erro', $e->getMessage());
}
}
Quando usar toast vs modal
| Cenario | Usar |
|---|---|
| Confirmacao rapida de sucesso | MadToast::success(...) |
| Aviso nao-bloqueante | MadToast::warning(...) |
| Erro de validacao por campo | MadValidationException::asModal() |
| Erro fatal / mensagem que precisa atencao | MadMessage::error() (modal) |
| Confirmacao destrutiva (excluir) | madConfirm() (modal) |
NUNCA fazer
{{-- ERRADO: incluir <mad-toast /> em cada pagina --}}
<mad-page-container>
<mad-toast />
...
</mad-page-container>
{{-- CERTO: incluir UMA vez no layout principal --}}
// ERRADO: script() para disparar toast
return (new MadResponse())->script("madToast('Salvo!', 'success')");
// CERTO: usar a op nativa
return (new MadResponse())->toast('Salvo!', 'success');
// ERRADO: echo / print de mensagem
echo "Salvo!";
// CERTO
return MadToast::success('Salvo!');
// ERRADO: alert() nativo
alert('Salvo!');
// CERTO
madToast.success('Salvo!');