@props(['seo']) {{-- --- 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')