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.