Docs›Services›MadSiteAssets
Services

MadSiteAssets

Carregamento lazy de CSS/JS no layout público.

Mad\Site\MadSiteAssets é o singleton estático que controla o carregamento lazy de CSS/JS nas páginas públicas reativas do MAD Site — como este próprio portal de documentação. Garante que o CSS/JS do portal e do admin reativo (Alpine + MadWire) só entram no HTML quando a página realmente precisa deles.

API enxuta nesta versão — sem "verticais"

Esta migração trouxe um MadSiteAssets deliberadamente mais simples que o legado: só enableSite(), enableMadUi(), pushHead() e pushBody() (mais renderHead(), renderBody(), reset() e state() para introspecção). Não existe enableVertical() nem o subsistema de CSS por "vertical" de site-builder de marketing — esse pedaço do site público (landing pages, temas de marketing) ficou fora do escopo desta migração.

API

Método estáticoRetornoDescrição
enableSite()voidMarca que a view precisa de mad-docs.css (tipografia/layout do portal). Idempotente.
enableMadUi()voidMarca que a view precisa de mad-ui.css + MadWire/Alpine (componentes reativos do admin, reaproveitados no público). Implica enableSite().
pushHead(string $html)voidInjeta HTML cru no <head> (meta tags, CSS de terceiros). Não escapa — confie na origem.
pushBody(string $html)voidInjeta HTML cru no fim do <body> (scripts).
renderHead()stringHTML para incluir no layout — <link rel="stylesheet"> dos CSS habilitados + os pushHead() acumulados.
renderBody()stringHTML para incluir no fim — <script> dos JS habilitados + os pushBody() acumulados.
reset()voidZera todos os flags/listas — útil em testes ou processos PHP de vida longa.
state()arrayIntrospecção do estado atual (debug).

O que cada flag realmente emite

FlagrenderHead()renderBody()
enableSite() /app/lib/include/builder/ui/mad-docs.css /app/lib/include/builder/ui/mad-docs.js
enableMadUi() /app/lib/include/builder/ui/mad-ui.css Lucide (UMD, CDN) → /lib/mad/mad.js → /lib/mad/mad-livewire.js → /app/lib/include/builder/ui/mad-ui.js

Todos os <script> saem com defer — a ordem importa (namespace Mad → MadWire global → componentes Alpine) e o defer é o que preserva essa ordem de execução após o parse do HTML. Os extras de pushHead()/pushBody() saem sempre por último, no bloco correspondente.

Como o lazy loading funciona, na prática

O layout dedicado deste portal (resources/views/public/docs-fw/layout.blade.php) chama renderHead()/renderBody() nos pontos certos do HTML:

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="utf-8">
    <title>@yield('title', 'Site')</title>

    @stack('site_head')
    {!! \Mad\Site\MadSiteAssets::renderHead() !!}
</head>
<body>

@yield('content')

@stack('site_body')
{!! \Mad\Site\MadSiteAssets::renderBody() !!}

</body>
</html>

Enquanto nada chamou enableSite()/enableMadUi(), ambos os métodos devolvem string vazia — zero CSS/JS extra no HTML. O ponto de entrada das páginas públicas reativas, MadSitePage::showPage(), liga os dois flags automaticamente antes de montar e renderizar o componente:

abstract class MadSitePage extends MadComponent
{
    public static function showPage(Request $request): Response
    {
        MadSiteAssets::enableSite();
        MadSiteAssets::enableMadUi();

        // ... mount() + render() + envolve em $siteLayout ...
    }
}

Isso é suficiente para qualquer subclasse de MadSitePage — você raramente chama MadSiteAssets diretamente fora de um layout customizado.

Ativação manual

Em views públicas que não passam por MadSitePage (HTML estático servido por uma rota simples), ative os flags manualmente antes do @stack/renderHead() do layout rodar:

// No topo da view (antes do conteúdo HTML que segue) — qualquer ponto que
// rode ANTES do layout chamar renderHead()/renderBody() serve:
\Mad\Site\MadSiteAssets::enableSite();   // mad-docs.css
\Mad\Site\MadSiteAssets::enableMadUi();  // mad-ui.css + MadWire/Alpine

// ... resto da view usando classes do mad-docs.css / mad-ui.css ...

Push customizado — meta tags e scripts inline

use Mad\Site\MadSiteAssets;

// Meta tag custom no <head>
MadSiteAssets::pushHead('<meta name="theme-color" content="#0B0D12">');

// Script no fim do <body>
MadSiteAssets::pushBody('<script>console.log("hello")</script>');

Atalhos via diretiva Blade

Mad\Site\BladeDirectives registra três diretivas curtas sobre os mesmos métodos — note que @sitehead/@sitebody aqui são atalhos para pushHead()/pushBody() (empurram HTML para a fila), não para renderHead()/renderBody() (que emitem a fila acumulada):

DiretivaEquivale a
@siteMadSiteAssets::enableSite() — sem argumentos.
@sitehead('<meta ...>')MadSiteAssets::pushHead('<meta ...>').
@sitebody('<script>...</script>')MadSiteAssets::pushBody('<script>...</script>').
<!DOCTYPE html>
<html>
<head>
    @sitehead('<meta name="robots" content="noindex">')
</head>
<body>
    @site
    <p>Conteúdo da página pública...</p>
</body>
</html>

Lista completa de diretivas globais (@csrf, @auth, etc.) em Helpers.

NUNCA fazer

Hardcoded de <link>/<script> no layout

Não escreva <link rel="stylesheet" href="/app/lib/include/builder/ui/mad-docs.css"> direto no layout — isso carrega o CSS sempre, mesmo em páginas que não precisam dele. Deixe renderHead()/renderBody() decidirem, condicionado a quem chamou enableSite()/enableMadUi().

Próximos passos