ajoute le portail Laravel : connexion prof/élève, session unique, gestion de classe, salle d'attente
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
aa31b6112f
commit
30e14b1c54
191 changed files with 25324 additions and 0 deletions
116
portail/resources/views/examen.blade.php
Normal file
116
portail/resources/views/examen.blade.php
Normal file
|
|
@ -0,0 +1,116 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Mode examen · Syllabus</title>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Archivo:wght@500;700;800;900&family=IBM+Plex+Mono:wght@400;600&display=swap" rel="stylesheet">
|
||||
@vite(['resources/css/app.css', 'resources/js/app.js'])
|
||||
<style>
|
||||
.etoile { clip-path: polygon(50% 0, 61% 35%, 98% 35%, 68% 57%, 79% 91%, 50% 70%, 21% 91%, 32% 57%, 2% 35%, 39% 35%); }
|
||||
.zigzag { background: linear-gradient(135deg, transparent 50%, #000 50% 62%, transparent 62%) 0 0 / 16px 16px, linear-gradient(45deg, transparent 50%, #000 50% 62%, transparent 62%) 0 0 / 16px 16px; }
|
||||
@keyframes flotte { 0%,100% { transform: translateY(0) rotate(var(--r, 0deg)); } 50% { transform: translateY(-10px) rotate(var(--r, 0deg)); } }
|
||||
.flotte { animation: flotte 6s ease-in-out infinite; }
|
||||
@keyframes clignote { 50% { opacity: 0; } }
|
||||
.curseur { animation: clignote 1s steps(1) infinite; }
|
||||
@media (prefers-reduced-motion: reduce) { .flotte, .curseur { animation: none; } }
|
||||
</style>
|
||||
<link rel="stylesheet" href="{{ asset('css/syllabus-theme.css') }}">
|
||||
</head>
|
||||
|
||||
<body class="bg-white font-display text-black antialiased">
|
||||
<header class="border-b-4 border-black bg-black text-white">
|
||||
<div class="mx-auto flex max-w-7xl flex-wrap items-center gap-x-6 gap-y-3 px-5 py-4 lg:px-10">
|
||||
<span class="border-2 border-white bg-[#ec3013] px-3 py-1 font-extrabold">MODE EXAMEN</span>
|
||||
<p class="flex-1 font-bold">Adressage et VLAN · E6 blanc SISR · Léa M.</p>
|
||||
<p class="flex items-center gap-3"><span class="font-semibold">Temps restant</span><span id="chrono" class="border-2 border-white bg-[#FFD23F] px-3 py-1 font-mono text-2xl font-semibold text-black" role="timer" aria-live="off">59:59</span></p>
|
||||
</div>
|
||||
</header>
|
||||
<div class="border-b border-[#e3e5e8] bg-[#fef7e0]">
|
||||
<ul class="mx-auto flex max-w-7xl flex-wrap gap-x-6 gap-y-1 px-5 py-2 text-sm font-extrabold lg:px-10">
|
||||
<li>■ Indices désactivés</li><li>■ Copier-coller bloqué</li><li>■ Sortie d’onglet signalée à l’enseignant</li><li>■ VM sans accès Internet</li><li class="ml-auto">Incidents signalés : <span id="incidents" class="font-mono">0</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
<main class="mx-auto grid max-w-7xl gap-10 px-5 py-10 lg:grid-cols-12 lg:px-10">
|
||||
<nav class="lg:col-span-3" aria-label="Questions">
|
||||
<h2 class="text-xl font-extrabold">Questions</h2>
|
||||
<ol class="mt-4 grid grid-cols-5 gap-2 lg:grid-cols-4">
|
||||
<li><a href="#q" class="grid h-11 place-items-center border border-[#dadce0] rounded-lg font-mono font-semibold bg-[#0b57d0] text-white">1</a></li>
|
||||
<li><a href="#q" class="grid h-11 place-items-center border border-[#dadce0] rounded-lg font-mono font-semibold bg-[#0b57d0] text-white">2</a></li>
|
||||
<li><a href="#q" class="grid h-11 place-items-center border border-[#dadce0] rounded-lg font-mono font-semibold bg-[#0b57d0] text-white">3</a></li>
|
||||
<li><a href="#q" class="grid h-11 place-items-center border border-[#dadce0] rounded-lg font-mono font-semibold bg-[#0b57d0] text-white">4</a></li>
|
||||
<li><a href="#q" class="grid h-11 place-items-center border border-[#dadce0] rounded-lg font-mono font-semibold bg-[#fef7e0]" aria-current="step">5</a></li>
|
||||
<li><a href="#q" class="grid h-11 place-items-center border border-[#dadce0] rounded-lg font-mono font-semibold bg-white">6</a></li>
|
||||
<li><a href="#q" class="grid h-11 place-items-center border border-[#dadce0] rounded-lg font-mono font-semibold bg-white">7</a></li>
|
||||
<li><a href="#q" class="grid h-11 place-items-center border border-[#dadce0] rounded-lg font-mono font-semibold bg-[#fce8e6]">8</a></li>
|
||||
<li><a href="#q" class="grid h-11 place-items-center border border-[#dadce0] rounded-lg font-mono font-semibold bg-white">9</a></li>
|
||||
<li><a href="#q" class="grid h-11 place-items-center border border-[#dadce0] rounded-lg font-mono font-semibold bg-white">10</a></li>
|
||||
<li><a href="#q" class="grid h-11 place-items-center border border-[#dadce0] rounded-lg font-mono font-semibold bg-white">11</a></li>
|
||||
<li><a href="#q" class="grid h-11 place-items-center border border-[#dadce0] rounded-lg font-mono font-semibold bg-white">12</a></li>
|
||||
</ol>
|
||||
<ul class="mt-5 grid gap-1 text-sm font-semibold">
|
||||
<li class="flex items-center gap-2"><span class="h-3 w-3 bg-black"></span> Répondue</li>
|
||||
<li class="flex items-center gap-2"><span class="h-3 w-3 border border-[#dadce0] rounded-lg bg-[#fce8e6]"></span> Marquée pour revoir</li>
|
||||
</ul>
|
||||
<p class="mt-6 border border-[#dadce0] rounded-lg p-3 font-mono text-sm font-semibold">4 / 12 répondues · Partie TP : 0 / 3 étapes</p>
|
||||
</nav>
|
||||
<div class="grid gap-10 lg:col-span-9">
|
||||
<fieldset id="q" class="border border-[#e3e5e8] rounded-2xl bg-white p-6">
|
||||
<legend class="-ml-2 border border-[#dadce0] rounded-lg bg-[#fef7e0] px-2 font-mono text-sm font-semibold">Question 5 · 1 point</legend>
|
||||
<p class="text-2xl font-extrabold">Un service de 50 postes doit avoir son propre sous-réseau. Quel masque choisissez-vous ?</p>
|
||||
<div class="mt-5 grid gap-3 sm:grid-cols-2">
|
||||
<label class="flex cursor-pointer items-center gap-3 border border-[#dadce0] rounded-lg px-4 py-3 font-mono font-semibold hover:bg-[#f8f9fa] has-[:checked]:bg-[#eef0fd]"><input type="radio" name="q5" class="h-5 w-5 accent-black"> /24 · 255.255.255.0</label>
|
||||
<label class="flex cursor-pointer items-center gap-3 border border-[#dadce0] rounded-lg px-4 py-3 font-mono font-semibold hover:bg-[#f8f9fa] has-[:checked]:bg-[#eef0fd]"><input type="radio" name="q5" class="h-5 w-5 accent-black"> /25 · 255.255.255.128</label>
|
||||
<label class="flex cursor-pointer items-center gap-3 border border-[#dadce0] rounded-lg px-4 py-3 font-mono font-semibold hover:bg-[#f8f9fa] has-[:checked]:bg-[#eef0fd]"><input type="radio" name="q5" class="h-5 w-5 accent-black"> /26 · 255.255.255.192</label>
|
||||
<label class="flex cursor-pointer items-center gap-3 border border-[#dadce0] rounded-lg px-4 py-3 font-mono font-semibold hover:bg-[#f8f9fa] has-[:checked]:bg-[#eef0fd]"><input type="radio" name="q5" class="h-5 w-5 accent-black"> /27 · 255.255.255.224</label>
|
||||
</div>
|
||||
<div class="mt-6 flex flex-wrap gap-3">
|
||||
<a href="#q" class="inline-flex items-center gap-3 border border-[#e3e5e8] rounded-2xl bg-white px-5 py-3 font-extrabold transition-transform hover:bg-[#fef7e0] active:shadow-none">← Précédente</a>
|
||||
<button type="button" class="inline-flex items-center gap-3 border border-[#e3e5e8] rounded-2xl bg-white px-5 py-3 font-extrabold transition-transform hover:bg-[#fef7e0] active:shadow-none">Marquer pour revoir</button>
|
||||
<a href="#q" class="inline-flex items-center gap-3 border border-[#e3e5e8] rounded-2xl bg-white px-5 py-3 font-extrabold transition-transform hover:bg-[#fef7e0] active:shadow-none bg-[#0b57d0] text-white hover:text-black">Suivante →</a>
|
||||
</div>
|
||||
</fieldset>
|
||||
<section class="border border-[#e3e5e8] rounded-2xl bg-[#13233A] font-mono text-white" aria-labelledby="t-partie">
|
||||
<div class="flex flex-wrap items-center gap-3 border-b border-[#e3e5e8] bg-[#0d192b] px-4 py-2">
|
||||
<h2 id="t-partie" class="flex-1 text-sm font-semibold">Partie TP · commutateur-sw1 · console 1</h2>
|
||||
<span class="border-2 border-white px-2 text-xs">vérification à la remise</span>
|
||||
</div>
|
||||
<div class="space-y-1 p-5 text-sm leading-relaxed">
|
||||
<p class="text-[#FFD23F]">Créez le VLAN 20 « compta » et placez-y l’interface eth2.</p>
|
||||
<p><span class="text-[#7CF2C0]">root@sw1</span>:~# ip link add link eth0 name eth0.20 type vlan id 20</p>
|
||||
<p><span class="text-[#7CF2C0]">root@sw1</span>:~# <span class="curseur inline-block h-4 w-2.5 translate-y-0.5 bg-[#fef7e0]"></span></p>
|
||||
</div>
|
||||
</section>
|
||||
<div class="flex flex-wrap items-center gap-5">
|
||||
<button type="button" id="rendre" class="inline-flex items-center gap-4 border border-[#e3e5e8] rounded-2xl bg-black px-6 py-4 text-lg font-extrabold text-white transition-transform hover:bg-[#ec3013].5.5 active:shadow-none">Rendre ma copie</button>
|
||||
<p class="font-semibold">La copie est rendue automatiquement à la fin du temps.</p>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
<script>
|
||||
(function () {
|
||||
var fin = Date.now() + 60 * 60 * 1000 - 1000;
|
||||
var el = document.getElementById('chrono');
|
||||
function tic() {
|
||||
var s = Math.max(0, Math.round((fin - Date.now()) / 1000));
|
||||
el.textContent = String(Math.floor(s / 60)).padStart(2, '0') + ':' + String(s % 60).padStart(2, '0');
|
||||
if (s < 300) el.classList.add('bg-[#ec3013]', 'text-white');
|
||||
}
|
||||
tic(); setInterval(tic, 1000);
|
||||
var inc = 0, spot = document.getElementById('incidents'), last = 0;
|
||||
function signal() { if (Date.now() - last < 800) return; last = Date.now(); inc++; spot.textContent = inc; spot.parentNode.classList.add('bg-[#ec3013]', 'text-white', 'px-2'); }
|
||||
document.addEventListener('visibilitychange', function () { if (document.hidden) signal(); });
|
||||
window.addEventListener('blur', signal);
|
||||
document.documentElement.addEventListener('mouseleave', signal);
|
||||
['copy', 'cut', 'paste'].forEach(function (ev) { document.addEventListener(ev, function (e) { e.preventDefault(); signal(); }); });
|
||||
document.getElementById('rendre').addEventListener('click', function () {
|
||||
if (confirm('Rendre la copie ? Vous ne pourrez plus la modifier.')) {
|
||||
this.textContent = 'Copie rendue ✓';
|
||||
this.disabled = true;
|
||||
}
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Loading…
Add table
Add a link
Reference in a new issue