{{-- resources/views/layouts/app.blade.php - VERSION OPTIMISÉE --}} {{-- ======== SEO OPTIMISATION AVANCÉE ======== --}} {{-- Title dynamique --}} @yield('title', 'TaPrestation - Trouvez des prestataires de services près de chez vous | Coiffeur, Ménage, Bricolage') {{-- Meta Description (max 160 caractères) --}} {{-- Meta Keywords (mots-clés longue traîne) --}} {{-- Canonical URL --}} {{-- Alternate Languages --}} {{-- Robots --}} {{-- Author & Publisher --}} {{-- Site Verification (à remplir avec vos codes) --}} {{-- Open Graph / Facebook --}} {{-- Twitter Card --}} {{-- Additional Meta for Rich Snippets --}} {{-- Geo Tags (France) --}} {{-- Dublin Core Metadata --}} {{-- Données structurées JSON-LD (Website + SearchAction) --}} @hasSection('json_ld') @yield('json_ld') @else @endif {{-- ======== FIN SEO ======== --}} {{-- CSRF pour les formulaires & AJAX --}} {{-- ======== PERFORMANCE: PRELOAD RESSOURCES CRITIQUES ======== --}} {{-- Preload hero image pour LCP --}} @hasSection('preload_hero') @yield('preload_hero') @endif {{-- Logo: pas de preload car utilisé en CSS/nav, le navigateur le charge naturellement --}} {{-- Performance: Preconnect to external resources --}} {{-- PWA Manifest --}} {{-- ======== CSS CRITIQUE INLINE (Above-the-fold) ======== --}} {{-- Fonts --}} {{-- Font Awesome --}} {{-- CSS/JS compilés Laravel (Vite) - PRIORITAIRE --}} @vite(['resources/css/app.css', 'resources/js/app.js']) {{-- CSS NON-CRITIQUES - Chargement différé pour performance --}} @php $mobileAppCssVersion = file_exists(public_path('css/mobile-app.css')) ? filemtime(public_path('css/mobile-app.css')) : time(); $globalErgoCssVersion = file_exists(public_path('css/global-ergonomics.css')) ? filemtime(public_path('css/global-ergonomics.css')) : time(); $designSystemCssVersion = file_exists(public_path('css/design-system.css')) ? filemtime(public_path('css/design-system.css')) : time(); @endphp {{-- Scripts critiques uniquement - CSRF token --}} {{-- Styles personnalisés par page --}} @stack('styles') @stack('head')
{{-- Navigation globale --}} @includeIf('layouts.navigation') {{-- En-tête de page optionnel --}} @if (isset($header))
{{ $header }}
@endif {{-- Flash Messages avec animations --}} {{-- Contenu principal - z-index bas pour rester sous la navbar --}}
@yield('content')
{{-- Mobile Bottom Navigation --}} @includeIf('components.mobile-bottom-nav') {{-- Cookie Consent Banner --}} @include('components.cookie-consent') @auth @if(in_array((string) (auth()->user()->role ?? ''), ['client', 'prestataire'], true)) @includeIf('components.guidance-assistant') @endif @endauth
{{-- Scripts personnalisés par page --}} @stack('scripts') {{-- Évite le rendu obsolète depuis le Back/Forward cache --}} {{-- Anti-double-navigation - différé pour ne pas bloquer le rendu --}} {{-- Scripts tiers chargés en différé --}} {{-- jQuery chargé uniquement si nécessaire --}} {{-- OneSignal Push Notifications --}} @php $currentHost = request()->getHost(); // Récupérer l'allowed_host depuis la config ou utiliser APP_URL $allowed = config('onesignal.allowed_host'); if (empty($allowed)) { $allowed = config('app.url'); } if (!empty($allowed) && !str_contains($allowed, '://')) { $allowed = 'https://' . $allowed; } $allowedHost = parse_url($allowed, PHP_URL_HOST) ?? $currentHost; // Comparer sans www pour supporter les deux variantes $normalizedCurrent = preg_replace('/^www\./', '', $currentHost); $normalizedAllowed = preg_replace('/^www\./', '', $allowedHost ?? ''); // Activer OneSignal si configuré ET (host correspond OU on est en production avec un app_id valide) $enableOneSignalHere = config('onesignal.enabled') && !empty(config('onesignal.app_id')) && ($normalizedCurrent === $normalizedAllowed || str_contains($currentHost, 'taprestation')); @endphp @if($enableOneSignalHere) @endif {{-- PWA Service Worker (fallback si OneSignal non configuré) --}} @if(!config('onesignal.app_id')) @endif {{-- Système de rappel pour activer les notifications --}} {{-- Reminder notifications désactivé: il ouvrait un overlay/modal intrusif sous CSP strict. --}} @once @endonce