@props([ 'title' => null, 'description' => null, 'ogType' => 'website', 'jsonld' => null, // Dates de publication et de mise à jour (crédibilité pour les moteurs IA). 'publishedTime' => null, 'modifiedTime' => null, ]) @php // Zones privées ou à faible valeur d'index : jamais indexées. $noindex = request()->is('admin*', 'connexion', 'recherche', 'app*'); $canonical = request()->url(); // sans query string : 3 niveaux = 1 URL canonique // Title cible 40-60 caractères : le suffixe de marque n'est ajouté que s'il tient // (og:site_name porte la marque dans tous les cas). $brandSuffix = ', SauverMonEntreprise.fr'; $pageTitle = $title ? (mb_strlen($title.$brandSuffix) <= 60 ? $title.$brandSuffix : mb_substr($title, 0, 60)) : 'SauverMonEntreprise.fr : Comprendre, anticiper, agir'; @endphp {{-- Active les animations seulement si JS est disponible (contenu visible par défaut sinon). --}} {{-- Thème AVANT le premier rendu : sombre par défaut, choix mémorisé respecté. Posé ici et non dans app.js (chargé en différé) pour éviter l'éclair de page claire au chargement. Doit rester aligné sur les défauts d'app.js. --}} {{ $pageTitle }} @if($description)@endif {{-- Favicon : logo officiel s'il est déposé (public/img/favicon.png ou logo.svg), sinon badge S de repli généré en SVG inline. --}} @php $favicon = collect(['img/favicon.png', 'img/favicon.svg', 'img/logo.svg']) ->first(fn ($chemin) => is_file(public_path($chemin))); // Le .ico n'est servi que s'il porte réellement quelque chose : un // fichier vide fait afficher une icône cassée plutôt que rien. $ico = is_file(public_path('favicon.ico')) && filesize(public_path('favicon.ico')) > 0; $apple = is_file(public_path('img/apple-touch-icon.png')); @endphp @if ($favicon) {{-- Le .ico multi-tailles répond à /favicon.ico, que les navigateurs demandent d'office ; le PNG sert aux tailles d'affichage modernes. --}} @if ($ico) @endif @else S') }}"> @endif {{-- Open Graph / Twitter --}} @if($description)@endif {{-- Auteur et dates de l'article : signaux de fraîcheur et de paternité repris par les moteurs IA. --}} @if($ogType === 'article') @if($publishedTime)@endif @if($modifiedTime)@endif @endif {{-- Données structurées spécifiques à la page. Deux voies équivalentes : le slot pour les vues classiques, la pile pour les composants Livewire pleine page, qui ne peuvent pas remplir un slot. --}} {{ $jsonld ?? '' }} @stack('jsonld') {{-- Mesure d'audience. Jamais en local, jamais sur les pages privées. Umami (sans cookie, à privilégier) : UMAMI_URL + UMAMI_ID dans .env. Google Analytics 4 : GA_MEASUREMENT_ID dans .env. --}} @unless (app()->environment('local') || $noindex) @if (config('services.umami.url') && config('services.umami.id')) @endif @if (config('services.ga4.id')) @endif @endunless @vite(['resources/css/app.css', 'resources/js/app.js']) Aller au contenu {{-- Avertissement d'entrée (hors espaces privés et pages d'authentification). --}} @unless (request()->is('admin*', 'espace*', 'connexion*', 'inscription*')) @endunless {{-- En-tête --}}
@auth @if (auth()->user()->isDirigeant()) @endif @else @endauth Urgence {{-- Bouton de menu : en dessous de « lg », la navigation principale est masquée. Sans lui, aucune rubrique n'était atteignable depuis l'en-tête sur mobile et sur tablette. --}}
{{-- Panneau de navigation mobile --}}
{{-- Liseré tricolore sous le menu --}}
{{ $slot }}
{{-- Décharge de responsabilité, présente sur toutes les pages --}}
Information générale : ce site ne délivre aucun conseil juridique personnalisé. Avant toute décision, consultez un avocat. Lire l'avertissement Trouver un avocat
{{-- Pied de page --}} {{-- Scripts propres à une page, empilés en fin de corps pour ne pas retarder le rendu. Sans cette pile, un @push('scripts') est silencieusement perdu. --}} @stack('scripts')