{{-- --- SEO meta (Section 13 of the PRD) -----------------------------
$seo is provided by every frontend controller via
App\Services\Seo\SeoMetaData (a small value object), so every
page controls its own title/description/canonical/OG image
without duplicating this block. --}}
{{ $seo->title }}
@if($seo->canonical)
@endif
@if($seo->robots)
@endif
{{-- Open Graph / Twitter Card --}}
@if($seo->image)
@else
@endif
@if(config('services.seo.google_site_verification'))
@endif
{{-- Structured data (JSON-LD) is injected per-page via the
@stack('structured-data') slot below, not here globally — a
portfolio project page needs CreativeWork schema, a blog post
needs Article schema, etc. (Section 13.6 of the PRD). --}}
@stack('structured-data')
@vite(['resources/css/app.css', 'resources/js/app.js'])
@stack('styles')
{{-- data-loader is what page-loader.js keys off; it is only set here, so the
loader never appears in the admin panel or on error pages. --}}
{{-- Skip link — accessibility requirement (Section 11), hidden until
focused so it doesn't affect sighted layout. --}}
Skip to main content
@include('partials.header')
{{ $slot ?? '' }}
@yield('content')
@include('partials.footer')
{{-- Renders only when a `toast` key is flashed to the session
(contact form success, newsletter signup, …). --}}
@stack('scripts')