@php $done = in_array($lesson->id, $doneIds, true); // Aplatir toutes les leçons pour calculer position globale + précédente. $flat = $formation->modules->flatMap->lessons->values(); $index = $flat->search(fn ($l) => $l->id === $lesson->id); $prev = $index > 0 ? $flat->get($index - 1) : null; $total = $flat->count(); $position = $index === false ? 0 : $index + 1; $doneCount = count($doneIds); $progress = $total > 0 ? (int) round($doneCount / $total * 100) : 0; $currentModule = $lesson->module; $typeMeta = [ 'video' => ['Vidéo', 'M15.75 10.5l4.72-4.72a.75.75 0 011.28.53v11.38a.75.75 0 01-1.28.53l-4.72-4.72M4.5 18.75h9a2.25 2.25 0 002.25-2.25v-9a2.25 2.25 0 00-2.25-2.25h-9A2.25 2.25 0 002.25 7.5v9a2.25 2.25 0 002.25 2.25z'], 'texte' => ['Lecture', 'M12 6.042A8.967 8.967 0 006 3.75c-1.052 0-2.062.18-3 .512v14.25A8.987 8.987 0 016 18c2.305 0 4.408.867 6 2.292m0-14.25a8.966 8.966 0 016-2.292c1.052 0 2.062.18 3 .512v14.25A8.987 8.987 0 0018 18a8.967 8.967 0 00-6 2.292m0-14.25v14.25'], 'quiz' => ['Quiz', 'M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9 5.25h.008v.008H12v-.008z'], 'document' => ['Atelier', 'M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z'], 'live' => ['Session live', 'M15.91 11.672a.375.375 0 010 .656l-5.603 3.113a.375.375 0 01-.557-.328V8.887c0-.286.307-.466.557-.327l5.603 3.112z'], ]; [$typeLabel, $typeIcon] = $typeMeta[$lesson->type] ?? $typeMeta['texte']; @endphp
{{-- ===================== SOMMAIRE (sidebar) ===================== --}} {{-- ===================== CONTENU ===================== --}}
{{-- Barre supérieure mobile --}}
Leçon {{ $position }}/{{ $total }}
{{-- Fil d'Ariane + méta --}}
{{ $currentModule?->title }} · Leçon {{ $position }} sur {{ $total }}
{{-- Titre + badges --}}

{{ $lesson->title }}

{{ $typeLabel }} @if ($lesson->duration_min) {{ $lesson->duration_min }} min @endif @if ($lesson->is_free_preview) Aperçu gratuit @endif @if ($done) Validée @endif
{{-- Vidéo --}} @if ($lesson->type === 'video' && $lesson->media_url)
@endif {{-- Quiz interactif : le contenu est un JSON {intro, questions:[...]}. --}} @if ($lesson->type === 'quiz') @php $quizData = json_decode($lesson->content, true); @endphp @if (is_array($quizData)) @else

Quiz indisponible.

@endif {{-- Corps : Markdown stylé. Les blockquotes "À retenir" sont mis en valeur. --}} @elseif ($lesson->content)
{!! \Illuminate\Support\Str::markdown($lesson->content, ['html_input' => 'escape']) !!}
@else

Contenu de la leçon à venir.

@endif {{-- Document à télécharger --}} @if ($lesson->type === 'document' && $lesson->media_url) Télécharger le support @endif {{-- ===================== ACTIONS / NAV ===================== --}} @php $isQuiz = $lesson->type === 'quiz'; @endphp
{{-- Validation : pour un quiz, le bouton n'apparaît qu'APRÈS soumission du QCM. --}}
@if ($done) Leçon validée @else @if ($isQuiz)

Passez le quiz ci-dessus pour pouvoir valider la leçon.

@endif
@csrf
@endif
{{-- Précédent / Suivant --}}