Feedback e display
mad-alert
mad-callout
mad-toast
Alertas inline
mad-alert nos 4 tipos disponíveis — use danger, não error.
Informação
Nova atualização disponível para o módulo financeiro.
Sucesso
Pedido #4821 confirmado e enviado para separação.
Atenção
Estoque do produto "Cabo HDMI" abaixo do mínimo.
Erro
Falha ao processar o pagamento — tente novamente.
resources/views/tutor/examples/feedback-alertas/alert-tipos.blade.php
<div style="display:flex;flex-direction:column;gap:8px;">
<mad-alert type="info" title="Informação">Nova atualização disponível para o módulo financeiro.</mad-alert>
<mad-alert type="success" title="Sucesso">Pedido #4821 confirmado e enviado para separação.</mad-alert>
<mad-alert type="warning" title="Atenção">Estoque do produto "Cabo HDMI" abaixo do mínimo.</mad-alert>
<mad-alert type="danger" title="Erro">Falha ao processar o pagamento — tente novamente.</mad-alert>
</div>
Callouts
mad-callout nos 4 tipos, sem ações — bloco de destaque simples.
Callout info
Bloco informativo neutro, sem ação.
Callout success
Operação concluída com sucesso.
Callout warning
Revise os dados antes de prosseguir.
Callout danger
Algo deu muito errado por aqui.
resources/views/tutor/examples/feedback-alertas/callout-tipos.blade.php
<div style="display:flex;flex-direction:column;gap:8px;">
<mad-callout type="info" title="Callout info" icon="info">Bloco informativo neutro, sem ação.</mad-callout>
<mad-callout type="success" title="Callout success" icon="check-circle">Operação concluída com sucesso.</mad-callout>
<mad-callout type="warning" title="Callout warning" icon="alert-triangle">Revise os dados antes de prosseguir.</mad-callout>
<mad-callout type="danger" title="Callout danger" icon="x-circle">Algo deu muito errado por aqui.</mad-callout>
</div>
Callout com ações
mad-callout com bloco de ações via :callout-footer.
Termos de uso atualizados
Revisamos a política de privacidade — confirme para continuar usando o sistema.
resources/views/tutor/examples/feedback-alertas/callout.blade.php
@php
$footer = '<mad-btn variant="primary" size="sm" icon="check">Aceitar</mad-btn>'
. '<mad-btn variant="ghost" size="sm">Depois</mad-btn>';
@endphp
<mad-callout type="warning" title="Termos de uso atualizados" icon="file-text" :callout-footer="$footer">
Revisamos a política de privacidade — confirme para continuar usando o sistema.
</mad-callout>
Toast (ação wire real)
mad:click dispara TutorFeedbackAlertas::onToast, que devolve MadResponse->toast(...).
resources/views/tutor/examples/feedback-alertas/toast.blade.php
<div style="display:flex;flex-wrap:wrap;gap:8px;">
<mad-btn variant="success" icon="check-circle" mad:click="onToast('success')">Sucesso</mad-btn>
<mad-btn variant="danger" icon="x-circle" mad:click="onToast('danger')">Erro</mad-btn>
<mad-btn variant="warning" icon="alert-triangle" mad:click="onToast('warning')">Atenção</mad-btn>
<mad-btn variant="secondary" icon="info" mad:click="onToast('info')">Info</mad-btn>
</div>
app/control/Tutor/TutorFeedbackAlertas.php
/**
* Dispara um toast real via ciclo wire — prova mad:click → ação PHP →
* MadResponse->toast() → mad.js (op 'toast') → window.madToast() →
* toaster Sonner global (auto-montado em document.body por mad-ui.js,
* um <ol id="mad-sonner-toaster-{posicao}"> por posição), fora do fluxo
* de scroll da página.
*
* NÃO monte <mad-toast /> (packages/mad-framework/.../toast.blade.php)
* dentro do partial da demo: esse componente é uma implementação legada
* paralela que REDEFINE window.madToast no escopo global (dispatch do
* evento 'madtoast', sem hífen, e sem chamar o mount do toaster Sonner),
* atropelando o window.madToast correto assim que o partial é renderizado
* — o toast passa a ser entregue só para a região estática embutida no
* fluxo normal da página (position:fixed sem data-y-position/
* data-x-position, então fica ancorada onde o componente foi impresso no
* HTML, não ao viewport) e nunca aparece pro usuário. Bug de framework
* (colisão de window.madToast entre dois sistemas de toast paralelos),
* fora do escopo de arquivos desta página — reportado ao orquestrador.
*/
public function onToast(string $variant = 'info'): MadResponse
{
$valid = ['info', 'success', 'warning', 'danger'];
if (!in_array($variant, $valid, true)) {
$variant = 'info';
}
$mensagens = [
'success' => 'Pedido confirmado com sucesso!',
'danger' => 'Falha ao processar a operação.',
'warning' => 'Estoque abaixo do mínimo.',
'info' => 'Nova atualização disponível.',
];
return (new MadResponse())
->toast($mensagens[$variant], $variant, 'onToast');
}
Código-fonte completo da página
app/control/Tutor/TutorFeedbackAlertas.php
<?php
namespace App\Control\Tutor;
use App\Support\Tutor\TutorPage;
use Mad\Http\MadResponse;
class TutorFeedbackAlertas extends TutorPage
{
protected string $catalogKey = 'feedback_alertas';
/**
* Dispara um toast real via ciclo wire — prova mad:click → ação PHP →
* MadResponse->toast() → mad.js (op 'toast') → window.madToast() →
* toaster Sonner global (auto-montado em document.body por mad-ui.js,
* um <ol id="mad-sonner-toaster-{posicao}"> por posição), fora do fluxo
* de scroll da página.
*
* NÃO monte <mad-toast /> (packages/mad-framework/.../toast.blade.php)
* dentro do partial da demo: esse componente é uma implementação legada
* paralela que REDEFINE window.madToast no escopo global (dispatch do
* evento 'madtoast', sem hífen, e sem chamar o mount do toaster Sonner),
* atropelando o window.madToast correto assim que o partial é renderizado
* — o toast passa a ser entregue só para a região estática embutida no
* fluxo normal da página (position:fixed sem data-y-position/
* data-x-position, então fica ancorada onde o componente foi impresso no
* HTML, não ao viewport) e nunca aparece pro usuário. Bug de framework
* (colisão de window.madToast entre dois sistemas de toast paralelos),
* fora do escopo de arquivos desta página — reportado ao orquestrador.
*/
public function onToast(string $variant = 'info'): MadResponse
{
$valid = ['info', 'success', 'warning', 'danger'];
if (!in_array($variant, $valid, true)) {
$variant = 'info';
}
$mensagens = [
'success' => 'Pedido confirmado com sucesso!',
'danger' => 'Falha ao processar a operação.',
'warning' => 'Estoque abaixo do mínimo.',
'info' => 'Nova atualização disponível.',
];
return (new MadResponse())
->toast($mensagens[$variant], $variant, 'onToast');
}
}
resources/views/tutor/feedback/alertas.blade.php
<x-tutor-page page="feedback_alertas">
<x-tutor-demo demo="tutor.examples.feedback-alertas.alert-tipos"
title="Alertas inline" desc="mad-alert nos 4 tipos disponíveis — use danger, não error." />
<x-tutor-demo demo="tutor.examples.feedback-alertas.callout-tipos"
title="Callouts" desc="mad-callout nos 4 tipos, sem ações — bloco de destaque simples." />
<x-tutor-demo demo="tutor.examples.feedback-alertas.callout"
title="Callout com ações" desc="mad-callout com bloco de ações via :callout-footer." />
<x-tutor-demo demo="tutor.examples.feedback-alertas.toast"
title="Toast (ação wire real)" desc="mad:click dispara TutorFeedbackAlertas::onToast, que devolve MadResponse->toast(...)."
php="TutorFeedbackAlertas::onToast" />
</x-tutor-page>