@php $siteName = $domainName ?? config('app.name', 'Laravel'); // Inline-@section('title', …)-Werte kommen von Blade bereits escaped an — // einmal dekodieren, damit {{ }} unten nicht doppelt escapt („&"). $pageTitle = html_entity_decode(trim($__env->yieldContent('title')), ENT_QUOTES, 'UTF-8') ?: $siteName; $pageDescription = html_entity_decode(trim($__env->yieldContent('meta_description')), ENT_QUOTES, 'UTF-8') ?: $siteName; // Self-Canonical als Default aus der Portal-URL + Request-Pfad (ohne Query): // pro Portal/Domain getrennt und unabhängig von URL::forceRootUrl – verhindert Cross-Portal-Duplicate. $portalBase = \App\Support\StaticPageCanonical::selfBase($domainUrl ?? null, ($webPortalContextApplied ?? false) === true); // Statische Seiten liegen auf Hub UND beiden Portalen mit identischem // Text (Anhang 2, E10): dort führt ein Host, die anderen verweisen // dorthin. Rechtstexte sind ausgenommen — siehe config/canonical.php. $canonicalUrl = trim($__env->yieldContent('canonical')) ?: (\App\Support\StaticPageCanonical::urlFor(request()->route()?->getName(), request()->getPathInfo()) ?: $portalBase.request()->getPathInfo()); $ogType = trim($__env->yieldContent('og_type')) ?: 'website'; $ogImage = trim($__env->yieldContent('og_image')); @endphp {{ $pageTitle }} @php $robotsDirective = trim($__env->yieldContent('robots')); @endphp {{-- Robots-Anweisung (z. B. noindex für private Vorschauen) --}} @if ($robotsDirective !== '') @endif {{-- Kanonische URL (entfällt bei noindex — es gibt keine öffentliche URL) --}} @if (! str_contains($robotsDirective, 'noindex')) @endif {{-- Sprach-Alternates (de/en) – pro Seite optional gesetzt --}} @hasSection('hreflang') @yield('hreflang') @endif {{-- RSS-Autodiscovery (Roadmap 3.1) – Portal-Feed und, auf Branchenseiten, der Feed der Branche --}} @yield('feed_links') {{-- OpenGraph / Social --}} @if ($ogImage) @endif @if ($ogImage) @endif {{-- Seitenspezifische Zusatz-Metas (z. B. article:* auf PM-Detailseiten) --}} @yield('meta_extra') {{-- Strukturierte Daten (JSON-LD) – pro Seite optional gesetzt --}} @yield('structured_data') @include('partials.local-fonts') @php $font = \App\Helpers\ThemeHelper::getFont(); $theme = config('app.theme', 'businessportal24'); @endphp {{-- app.js bündelt Livewire + Alpine (livewire.esm) — @livewireScriptConfig unten verhindert, dass Livewire zusätzlich sein eigenes Script injiziert (sonst zwei Alpine-Instanzen und kaputte wire:model-Bindings). --}} @livewireStyles @vite([\App\Helpers\ThemeHelper::getThemeCssPath(), 'resources/js/app.js'], $domainConfig['assets_dir'] ?? 'build/web') @stack('styles') @yield('content') {{-- Schwebendes Kontakt-Widget (unten rechts, alle Web-Domains) --}} @stack('scripts') @livewireScriptConfig