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.
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ático | Retorno | Descrição |
|---|---|---|
enableSite() | void | Marca que a view precisa de mad-docs.css (tipografia/layout do portal). Idempotente. |
enableMadUi() | void | Marca que a view precisa de mad-ui.css + MadWire/Alpine (componentes reativos do admin, reaproveitados no público). Implica enableSite(). |
pushHead(string $html) | void | Injeta HTML cru no <head> (meta tags, CSS de terceiros). Não escapa — confie na origem. |
pushBody(string $html) | void | Injeta HTML cru no fim do <body> (scripts). |
renderHead() | string | HTML para incluir no layout — <link rel="stylesheet"> dos CSS habilitados + os pushHead() acumulados. |
renderBody() | string | HTML para incluir no fim — <script> dos JS habilitados + os pushBody() acumulados. |
reset() | void | Zera todos os flags/listas — útil em testes ou processos PHP de vida longa. |
state() | array | Introspecção do estado atual (debug). |
O que cada flag realmente emite
| Flag | renderHead() | 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):
| Diretiva | Equivale a |
|---|---|
@site | MadSiteAssets::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
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().