Docs›Services›MadBlade
Services

MadBlade

Fachada de render Blade (Illuminate) — view, render, renderString, diretivas mad-*.

Mad\View\MadBlade é a fachada estática que envolve o motor de templates do MAD — renderiza arquivos .blade.php, strings inline e componentes reativos (MadComponent), e expõe um pipeline de compilação próprio (MadBladeCompiler) que entende as tags <mad-*> do framework além do Blade padrão.

Substituiu o BladeOne

MadBlade hoje compila sobre o Illuminate\View\Compilers\BladeCompiler nativo do Laravel — o motor BladeOne (eftec/bladeone) usado nas fases anteriores do framework foi substituído. @props e <x-slot name="..."> (named slots) funcionam normalmente hoje — se você leu em outro lugar que BladeOne não suportava, essa limitação não existe mais nesta versão.

Renderizar templates

Dentro de um MadComponent você raramente chama MadBlade diretamente — basta retornar o nome da view em view() e o framework cuida do resto. Use a fachada quando precisa de HTML renderizado fora desse ciclo: dentro de uma op MadResponse->html(), num e-mail, num PDF, etc.

use Mad\View\MadBlade;

// Renderiza para string — uso típico dentro de MadResponse::html()
$html = MadBlade::render('parciais.lista-produtos', ['produtos' => $produtos]);

return (new MadResponse())->html('#lista-container', $html);

// Renderiza e retorna um elemento "pronto pra add()" — usado em integrações
// com código que ainda monta a página por fora de um MadComponent
$el = MadBlade::view('admin.relatorio-customizado', ['titulo' => 'Relatório']);
$el->show(); // echo do HTML

// Template inline (string), sem precisar de um arquivo .blade.php
$html = MadBlade::renderString('Olá, {{ $nome }}!', ['nome' => 'Maria']);
MétodoRetornoQuando usar
render($view, $data = [])stringHTML pronto — uso mais comum (ex.: dentro de MadResponse->html()).
view($view, $data = [])MadRenderedWrapper com show()/__toString() — para APIs que esperam um objeto "exibível".
renderString($template, $data = [])stringTemplate Blade inline (sem arquivo) — cacheado por hash do conteúdo.
viewString($template, $data = [])MadRenderedMesma ideia de view(), mas para template inline.
component($class, $params = [])MadRenderedInstancia + mount() + render de um MadComponent já envelopado no wrapper.
configure(['views' => ..., 'cache' => ...])voidSobrescreve os paths antes do primeiro uso (a chave mode, legado do BladeOne, é aceita e ignorada).
share($key, $value)voidVariável global em toda view renderizada por MadBlade.
directive($name, callable $handler)voidRegistra diretiva custom no compilador.

Views ficam em resources/views/ (raiz do app) e são referenciadas por dot-notation, exatamente como qualquer view Laravel — ex.: 'public.docs-fw.pages.services.madblade' resolve para resources/views/public/docs-fw/pages/services/madblade.blade.php. Templates do próprio pacote do framework (componentes mad-*) ficam num segundo diretório de busca interno, consultado depois dos templates do app — o que permite sobrescrever qualquer componente mad-* criando um arquivo de mesmo nome no app.

Renderizar um MadComponent diretamente

component($class, $params = []) instancia um MadComponent, roda mount($params) e devolve um MadRendered com o HTML já envelopado pelo wrapper (modal/drawer/internal) — imprima com show() ou interpole com {!! ... !!} (via __toString()). Útil para embutir um componente reativo dentro de uma view comum:

use Mad\View\MadBlade;

// Instancia, monta e renderiza um MadComponent fora do ciclo normal de rota —
// útil para embutir um componente reativo dentro de uma view comum.
return MadBlade::component(ContadorComponent::class, ['inicial' => 10]);
MAD__BLADE_COMMENT__1__
{!! \Mad\View\MadBlade::component(\App\Components\ContadorComponent::class) !!}

@props e named slots

Componentes Blade próprios do app podem declarar props com default via @props([...]) — equivalente a definir $var = $var ?? default; dentro de um bloco @php para cada chave, sem sobrescrever valores já vindos do componente pai:

MAD__BLADE_COMMENT__2__
@props(['title' => '', 'size' => 'md', 'required' => false])

<div class="meu-card meu-card-{{ $size }}">
    <strong>{{ $title }}</strong>
    @if($required) <span class="mad-required">*</span> @endif
</div>

Slots nomeados via <x-slot name="..."> também são suportados dentro de qualquer tag <mad-*>/<x-*> com corpo — o compilador extrai cada x-slot e os entrega como slots clássicos do Illuminate\View\Factory. O atalho <menu>...</menu> também é aceito como sinônimo de <x-slot name="menu"> (usado por mad-dropdown e similares):

MAD__BLADE_COMMENT__3__
<mad-modal name="m" title="Confirmar">
    <x-slot name="footer">
        <mad-btn mad:click="onConfirmar" variant="primary">Confirmar</mad-btn>
    </x-slot>
    Tem certeza que deseja continuar?
</mad-modal>

MAD__BLADE_COMMENT__4__
<mad-dropdown label="Ações">
    <menu>
        <mad-dropdown-item mad:click="onEditar">Editar</mad-dropdown-item>
    </menu>
</mad-dropdown>

Diretivas built-in

O boot do MadBlade registra um conjunto de diretivas auxiliares — todas chamam métodos estáticos _icon()/_field()/_section()/etc. da própria classe, que produzem HTML pronto sem precisar de um componente Blade separado:

@madIcon('check-circle')
@madIcon('check-circle', 'mad-text-success', '20px')

@madField('Nome', $inputHtml)
@madField('Nome', $inputHtml, true, 'Como aparece nos documentos')

@madSection('Dados gerais', 'Informações básicas do cadastro', 'info')

@madAlert('Operação concluída com sucesso.', 'success', 'Tudo certo')

@madBadge('Ativo', 'success')

@madBtn('Salvar', 'primary', 'save', 'type="submit"')

@madSeparator('Endereço')

@madCard($conteudoHtml, 'mad-card-compact')

@css('app/lib/include/builder/ui/meu-componente.css')
@css('app/lib/include/builder/ui/meu-componente.css', true) MAD__BLADE_COMMENT__5__

@madBind('contador') MAD__BLADE_COMMENT__6__

@js($arrayPhp) MAD__BLADE_COMMENT__7__

@canAccess('ProdutoForm')
    <mad-btn navigate="ProdutoForm">Novo produto</mad-btn>
@endCanAccess
DiretivaGera
@props([...])Defaults de props sem sobrescrever valores já definidos.
@madIcon($nome, $class?, $size?)Ícone Lucide (<i data-lucide="...">).
@madField($label, $html, $required?, $hint?)Wrapper de campo com label e hint.
@madSection($title, $desc?, $icon?)Cabeçalho de seção.
@madAlert($msg, $type?, $title?, $icon?)Caixa de alerta inline (info|success|warning|error).
@madBadge($texto, $variant?)Badge/pill.
@madBtn($label, $variant?, $icon?, $attrs?, $size?)Botão HTML cru (fora do ciclo de um mad-btn reativo).
@madSeparator($label?)Linha divisória, com ou sem label.
@madCard($conteudo, $class?)Wrapper de card.
@css($path, $scope?)Embute um arquivo CSS inline — $scope = true isola seletores por hash (estilo Vue scoped).
@madAction(...) / @madGet(...) / @madUrl(...)Atalhos para MadAction — ver MadAction.
@madBind($prop)<span data-mad-bind="prop"> — alvo de update parcial via MadResponse->bind().
@madWire([...])Emite mad-data='{...}' com o state inicial das props públicas listadas.
@js($valor)Serializa PHP para JSON seguro dentro de um atributo HTML (equivalente ao @js do Laravel).
@canAccess('Classe', 'método'?) / @endCanAccessRenderiza o bloco só se o usuário tem permissão (via PermissionGate).

Diretivas mad:* → data-mad-*

Depois que o compilador nativo termina, um pós-passe converte os atributos mad:click, mad:model, mad:model.live, mad:submit, mad:change, mad:loading e mad:loading.remove para seus equivalentes data-mad-* (HTML5 válido, lido pelo MadWire no client). Blocos <pre>/<code> ficam protegidos dessa conversão, então documentação que apenas cita mad:click dentro de um exemplo não vira atributo de verdade. Ver Diretivas mad-*.

Registrar diretivas e compartilhar dados

use Mad\View\MadBlade;

// Registrado uma vez no boot do app (ex.: AppServiceProvider). O handler
// recebe a expressão entre parênteses como string crua e deve devolver PHP
// pronto para ser injetado no template — incluindo as tags de abertura e
// fechamento, igual a qualquer diretiva nativa do Laravel.
MadBlade::directive('meuHelper', function (string $exp): string {
    $openTag = '<' . '?php';
    return "{$openTag} echo minhaFuncao({$exp}); ?>";
});
use Mad\View\MadBlade;

// Disponível em TODA view renderizada por MadBlade a partir daqui
MadBlade::share('appName', 'Minha ERP');

Cache e configuração de paths

O cache compilado vive em storage/framework/mad-blade/ por padrão (criado automaticamente). configure(['views' => ..., 'cache' => ...]) sobrescreve os paths antes do primeiro uso — útil em testes ou setups multi-app. Não existe um método clearCache(): para forçar recompilação, apague o diretório de cache diretamente.

Tags mad-* citadas dentro de comentários Blade

O compilador preserva o conteúdo de comentários Blade intacto antes de converter <mad-xxx> em <x-xxx> — então um exemplo de uso dentro de um comentário (como os desta própria página) não vira uma invocação real nem corre risco de recursão infinita quando o componente cita a si mesmo no próprio exemplo.

Próximos passos