Pular para o conteúdo
Navegar na documentação
Nesta página

Blade no Pocket Banana

O Pocket Banana monta Illuminate Blade sem o framework Laravel completo. Views do usuário são procuradas em Content/Views, nas views MDX geradas e em Content/Pages.

Variáveis de rota

Variável Conteúdo
$head objeto de head renderizável
$meta metadata tipada da rota
$extra dados finais da rota, incluindo items injetado
$currentPath path atual
$documentHeadings lista calculada de títulos h2/h3 em rotas MDX
$presentationUrl URL pública da variante slides.html para uma rota MDX com type: presentation
$sourceFile caminho da fonte .mdx publicada quando a rota pertence a uma Collection com mdx_source: true; ausente nos demais casos
$lastModified DateTimeImmutable ou null, data da última modificação resolvida para a rota
$meta->readingTime tempo de leitura gerado para a rota MDX; nulo em Blade
cada chave de extra variável direta com o mesmo nome
$items Collections relacionadas, quando existirem

$meta->extra contém apenas o mapa autoral. $extra contém os dados finais da rota. Evite criar chaves head, meta, extra, currentPath, lastModified, items, documentHeadings, presentationUrl, sourceFile ou readingTime, pois o renderer ou o pipeline de conteúdo reserva ou sobrescreve esses nomes.

$sourceFile já aponta para a saída irmã com sufixo .mdx, mas não inclui site.basePath. Para gerar um link que funcione também em GitHub Pages ou em outro subcaminho, passe o valor por $siteUrl->asset():

@if (isset($sourceFile))
    <a href="{{ $siteUrl->asset($sourceFile) }}">Ver fonte MDX</a>
@endif

$lastModified é uma variável de rota independente: use $lastModified, e não $meta->lastModified. Ela é a mesma data usada em sitemap.xml: vem do último commit quando o histórico Git está disponível e respeita content.dates.policy nos demais casos. O valor é um DateTimeImmutable ou null, para que cada template escolha a apresentação local:

@if ($lastModified)
    <span>Atualizado em {{ $lastModified->format('d/m/Y') }}</span>
@endif

Essa variável existe em todos os templates Blade renderizados pelo site: páginas MDX, páginas Blade, apresentações, variantes de slides, páginas de erro e templates de cover. O renderer apenas fornece o valor; ele não acrescenta automaticamente o texto Atualizado em ao HTML. Se a data precisar aparecer, o template deve renderizá-la explicitamente, como no exemplo acima. Portanto, não é necessário duplicar essa informação em extra.publishedLabel ou no front matter.

Variáveis globais

Variável Conteúdo
$basePath raiz absoluta usada pela aplicação
$cssAsset caminho do CSS atual, com hash no build
$assets manifesto de CSS e JavaScript publicados; use $assets->path('css/nome.css') ou $assets->path('js/nome.js')
$fontStylesheet caminho do stylesheet local de fontes, com hash no build, ou null quando não há fontes configuradas
$fontPreloads lista deduplicada de caminhos públicos dos WOFF2 publicados no build, pronta para <link rel="preload">
$siteUrl resolvedor de URLs do site, usado para aplicar domínio e basePath aos assets
$navItems rotas cujo showInNav é true

Layouts do projeto atual

layouts.app renderiza $head, preloads de fontes, CSS, header e footer, e oferece as seções hero, content e sidebar, além dos stacks meta e scripts. Um layout customizado deve preservar pelo menos o head, os preloads, o CSS e a seção content esperados pelas páginas geradas; o passo a passo está em Personalizar templates, componentes e covers.

layouts.manual é específico desta documentação e usa $items['docs'] para navegação, breadcrumbs e páginas adjacentes, além de $documentHeadings para o sumário da página.

Templates de cover recebem os dados normais da rota, $assets, $domain, $fontStylesheet e $fontPreloads durante a geração. covers.cover é o default; o campo de metadata cover pode selecionar outra view. Covers são documentos HTML independentes convertidos em PNG 1200×630. Durante a conversão, assets publicados são servidos por um php -S local temporário; use $cover->asset('/'.$fontStylesheet) para o stylesheet de fontes quando ele existir, $cover->asset($fontPreload) para preloads e $cover->asset($assets->path('css/nome.css')) para outros CSS, mantendo a resolução de fontes relativas.

Superfície suportada

Páginas Blade podem usar diretivas do compilador, herança, seções, stacks, props, atributos, slots e componentes anônimos. O Pocket Banana não registra helpers ou diretivas próprias.

Não conte com request, sessão, autenticação, banco, rotas Laravel, service providers ou componentes de classe da aplicação. O container oferece somente o necessário para a factory de views e para resolver componentes anônimos.

Em MDX, somente tags de componentes <x-...> atravessam o parser como Blade executável; echos e diretivas são escapados.

Contrato de componentes em MDX

Uma tag <x-nome> resolve um arquivo anônimo em Content/Views/Components (pontos no nome representam diretórios). O parser aceita atributos HTML literais, componentes autocontidos (<x-ui.badge />), conteúdo entre abertura e fechamento e componentes aninhados. Ele não avalia PHP ou expressões nos atributos:

<x-ui.card title="Notas" data-section="intro">
    <x-slot:actions><x-ui.badge>novo</x-ui.badge></x-slot:actions>
    Texto do slot default.
</x-ui.card>

No arquivo do componente, @props([...]) declara props e defaults, $slot contém o slot default, slots nomeados ficam disponíveis pelo nome ($actions) em Blade completo e $attributes contém os atributos que não foram declarados como props. A sintaxe x-slot:* não é suportada pelo parser MDX: ali ela sai como HTML/texto e não preenche $actions. O componente precisa imprimir $attributes para que classes, id, data-* ou aria-* cheguem ao HTML; merge() pode combinar classes default. Esses valores são literais no MDX e devem ser tratados como entrada não confiável pelo componente.

O conteúdo do slot já foi convertido para o HTML intermediário antes de Blade renderizar o componente, mas não passa novamente pelo parser Markdown. Portanto, **negrito** dentro do slot não vira <strong>. Coloque Markdown fora da tag ou crie uma composição Blade que aceite HTML pronto quando essa distinção for necessária.

Echos ({{ }} e {!! !!}), @if, @foreach, @props escritos no documento e outras diretivas continuam texto literal. Para condicionais, loops, dados dinâmicos ou escaping contextual, use uma página .blade.php ou encapsule a lógica em um componente. Não use echos literais para contornar escaping: mantenha a renderização segura no componente e forneça uma alternativa HTML progressivamente aprimorada.