@inject('renderer', 'App\Domains\Encyclopedia\Services\ContentRenderer') @php // Maillage interne automatique : les notions citées pointent vers leur fiche de glossaire. $renderer->linkGlossaryTerms(true); // La FAQ suit le niveau de lecture : les questions d'un dirigeant qui // découvre la procédure ne sont pas celles d'un praticien. Le balisage // FAQPage, lui, déclare TOUTES les questions de la page : un moteur n'a // pas de niveau, et a tout intérêt à voir la couverture complète. $faq = collect(\App\Support\FaqParNiveau::pour($entry->faq, $level)); $faqBalisee = collect(\App\Support\FaqParNiveau::toutes($entry->faq)); // Temps de lecture indicatif par niveau (~180 mots/minute), affiché en regard // de chaque niveau pour que le lecteur choisisse en connaissance de cause. $texteDeBlocs = function ($blocs) { $texte = ''; foreach ((array) $blocs as $bloc) { foreach ($bloc as $valeur) { $texte .= ' '.(is_array($valeur) ? implode(' ', array_map('strval', $valeur)) : (string) $valeur); } } return $texte; }; $version = $entry->publishedVersion; $minutesParNiveau = []; foreach (['debutant' => 'content_beginner', 'standard' => 'content_standard', 'expert' => 'content_expert'] as $cle => $champ) { $mots = str_word_count(strip_tags($texteDeBlocs($version?->{$champ} ?? []))); $minutesParNiveau[$cle] = max(1, (int) ceil($mots / 180)); } // Sommaire « Sur cette page » : les titres de sections du niveau courant. $sommaire = []; foreach ($blocks as $iBloc => $bloc) { if (($bloc['type'] ?? '') === 'section' && ! empty($bloc['title'])) { $sommaire['bloc-'.$iBloc] = $bloc['title']; } } if ($faq->isNotEmpty()) { $sommaire['faq'] = 'Questions fréquentes'; } @endphp @php $article = array_filter([ '@type' => 'Article', 'headline' => $entry->title, 'description' => $entry->summary, 'inLanguage' => 'fr-FR', 'mainEntityOfPage' => route('encyclopedie.show', $entry), 'datePublished' => optional($entry->created_at)->toIso8601String(), 'dateModified' => optional($version?->verified_at ?? $entry->updated_at)->toIso8601String(), 'author' => [ '@type' => 'Person', 'name' => $version?->author?->name ?? 'Alexandre Baumberger', 'description' => 'Ancien juge au tribunal de commerce de Bordeaux (2018-2026) : juge du contentieux, juge des procédures collectives et juge-commissaire.', 'url' => route('page.apropos'), ], 'publisher' => [ '@type' => 'Organization', 'name' => 'SauverMonEntreprise.fr', 'url' => route('home'), 'logo' => ['@type' => 'ImageObject', 'url' => asset('img/og-default.png')], ], ]); $breadcrumb = [ '@type' => 'BreadcrumbList', 'itemListElement' => [ ['@type' => 'ListItem', 'position' => 1, 'name' => 'Accueil', 'item' => route('home')], ['@type' => 'ListItem', 'position' => 2, 'name' => 'Encyclopédie', 'item' => route('encyclopedie.index')], ['@type' => 'ListItem', 'position' => 3, 'name' => $entry->title], ], ]; $graph = [$article, $breadcrumb]; if ($faqBalisee->isNotEmpty()) { $graph[] = [ '@type' => 'FAQPage', 'mainEntity' => $faqBalisee->map(fn ($q) => [ '@type' => 'Question', 'name' => $q['q'], 'acceptedAnswer' => ['@type' => 'Answer', 'text' => $q['a']], ])->all(), ]; } $jsonldGraph = ['@context' => 'https://schema.org', '@graph' => $graph]; @endphp
{{-- ══ Colonne gauche : le sommaire, seul, navigation pure ══ --}} {{-- Colonne contenu --}}

{{ $entry->title }}

{{ $entry->summary }}

Validé @if($version?->verified_at) Vérifié le {{ $version->verified_at->format('d/m/Y') }} @endif
{{-- Sélecteur de niveau compact (mobile uniquement, la sidebar le porte sur desktop) --}}
@foreach (['debutant' => 'Débutant', 'standard' => 'Standard', 'expert' => 'Expert'] as $key => $label) {{ $label }} ≈ {{ $minutesParNiveau[$key] }} min @endforeach
@if ($faq->isNotEmpty())

Questions fréquentes

@foreach ($faq as $item)
{{ $item['q'] }}

{{ $renderer->html($item['a']) }}

@endforeach
@endif {{-- Pied de fiche : auteur et date visibles (crédibilité, citabilité IA). --}}
Relecteur : {{ $version?->reviewer?->name ?? '-' }}
@if ($entry->created_at)
Publié le :
@endif @php $maj = $version?->verified_at ?? $entry->updated_at; @endphp @if ($maj)
Mis à jour le :
@endif

Contenu de démonstration destiné à illustrer la structure éditoriale. Toute information doit être vérifiée avant usage.

{{-- Colonne latérale --}}