= $maxTentatives; $erreur = $verrouille ? '' : 'Code incorrect. Réessaie.'; } } } // Tentatives restantes à afficher (pastilles), calculées après un éventuel échec ci-dessus $tentativesRestantes = $maxTentatives; $etatActuel = null; if (!$deverrouille) { $etatActuel = recupererTentativePresentation($ipHash); $tentativesRestantes = $maxTentatives - ($etatActuel ? (int) $etatActuel['attempts'] : 0); if ($tentativesRestantes < 0) { $tentativesRestantes = 0; } } if ($deverrouille) { // ---- Présentation en cours : page autonome plein écran, sans le header du site ---- require_once('../scripts/requireCaptcha.php'); require_once('../functions/sendLogs.php'); require_once(__DIR__ . '/../functions/assets.php'); sendPageLog(); $markdown = recupererSetting('presentation_markdown') ?? ''; // Diapositives séparées par une ligne ne contenant que --- (même convention que // Marp/reveal.js : facile à retenir, et ça reste du markdown lisible tel quel). // Sans --- dans le texte, tout le contenu forme une seule diapositive : dans ce // cas on garde une simple page de lecture, sans flèches ni compteur inutiles. $morceaux = preg_split('/^[ \t]*-{3,}[ \t]*$/m', $markdown); $diapositives = []; foreach ($morceaux as $morceau) { $texte = trim($morceau); if ($texte !== '') { $diapositives[] = $texte; } } $nombreDiapositives = count($diapositives); $modeDiaporama = $nombreDiapositives > 1; ?> Mode présentation - Esteban MOUSSU
Mode présentation
Quitter

Contenu à venir. Ajoute du texte depuis le panel admin, section « Mode présentation ».

' . htmlspecialchars($diapositives[0]) . ''; echo '

Chargement du contenu...

'; ?>
$texteDiapositive) { $classeActive = $index === 0 ? ' is-active' : ''; echo '
'; echo ''; echo '

Chargement du contenu...

'; echo '
'; } ?>
(function () { var source = document.getElementById('markdown-source'); var cible = document.getElementById('markdown-target'); if (source && cible) { var markdown = source.textContent; cible.innerHTML = DOMPurify.sanitize(marked.parse(markdown, { breaks: true })); } if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return; if (!('IntersectionObserver' in window)) return; // Chaque bloc du contenu (titre, paragraphe, image...) apparaît en douceur à la lecture var cibles = document.querySelectorAll('.presentation-markdown > *'); var observer = new IntersectionObserver(function (entries) { entries.forEach(function (entry) { if (entry.isIntersecting) { entry.target.classList.add('visible'); observer.unobserve(entry.target); } }); }, { threshold: 0.1, rootMargin: '0px 0px -60px 0px' }); cibles.forEach(function (el) { el.classList.add('reveal'); observer.observe(el); }); })(); JS; } else { // ---- Rendu diaporama : une diapositive affichée à la fois, navigation clavier/ // tactile/boutons, position mémorisée dans l'URL (#slide-3) pour pouvoir // partager un lien direct vers une diapositive précise ---- echo <<<'JS' JS; } ?>
Accès bloqué

Trop de tentatives

Le code a été saisi plusieurs fois de suite sans succès. L'accès par code PIN est bloqué pour cet appareil.

Connecte-toi en administrateur pour débloquer l'accès immédiatement.

Se connecter en administrateur
Accès protégé

Mode présentation

Entre le code à 9 chiffres pour accéder au contenu.

' . htmlspecialchars($erreur) . '
'; } ?>
'; } ?>
Tentatives restantes
'; } ?>