// Parcours 2 — Étudiant : Login, Dashboard, Pré-examen, Examen, Soumission const StudLogin = () => (

Bienvenue ✨

Connecte-toi à ton espace étudiant pour accéder à tes évaluations.

{ e.preventDefault(); location.hash = '#/etudiant'; }}>
); const StudDashboard = ({ mobile = false }) => { const D = window.STUDYHUB_DATA; const evals = [ { id: 'ev-312', title: 'Algorithmique — Complexité & récursivité', module: 'INF201', duration: '45 min', due: 'Aujourd’hui 18h00', urgency: 'red', status: 'todo', hoursLeft: 3 }, { id: 'ev-315', title: 'Droit constitutionnel — Séparation des pouvoirs', module: 'DRO104', duration: '1h', due: 'Demain 14h00', urgency: 'amber', status: 'todo', hoursLeft: 28 }, { id: 'ev-318', title: 'Anglais B2 — Reading comprehension', module: 'LAN202', duration: '30 min', due: '28 avril 16h', urgency: 'none', status: 'todo', hoursLeft: 96 }, { id: 'ev-301', title: 'Microéconomie — Élasticité', module: 'ECO201', duration: '1h', due: 'Terminée le 10 avril', urgency: 'done', status: 'done', score: 15.5 }, ]; const Card = ({ ev }) => { const urgency = { red: { bg: '#FEE2E2', color: '#B91C1C', label: 'Urgent — moins de 24h', icon: '🔥' }, amber: { bg: '#FEF3C7', color: '#B45309', label: 'À faire sous 48h', icon: '⏳' }, none: { bg: '#EDE9FE', color: '#6D28D9', label: 'À faire', icon: '📝' }, done: { bg: '#F0FDF9', color: '#047857', label: 'Terminée', icon: '✓' }, }[ev.urgency]; return (
{urgency.icon} {urgency.label} {ev.module}
{ev.title}
{ev.duration} {ev.due}
{ev.status === 'todo' ? ( Commencer ) : (
Ta note {ev.score}/20
)}
); }; const content = (
Bonjour

Lucas 👋

{!mobile && }
2 évaluations à passer cette semaine
La plus urgente expire dans 3 heures
Mes évaluations
{evals.map(ev => )}
); if (mobile) { return
{content}
; } return
{content}
; }; const StudPreExam = ({ mobile = false }) => { const [checked, setChecked] = React.useState([false, false, false]); const [countdown, setCountdown] = React.useState(null); const allChecked = checked.every(Boolean); React.useEffect(() => { if (countdown === null) return; if (countdown === 0) { location.hash = '#/etudiant/examen/ev-312'; return; } const t = setTimeout(() => setCountdown(countdown - 1), 1000); return () => clearTimeout(t); }, [countdown]); const content = (
{countdown !== null && countdown > 0 ? (
{countdown}
Préparation du plein écran…
) : (
Évaluation · INF201

Algorithmique — Complexité & récursivité

Durée
45 min
Exercices
8
Points
20
Avant de commencer, confirme :
{[ 'Je comprends que le chronomètre démarre dès le clic sur "Démarrer" et qu’il ne peut pas être mis en pause.', 'Je m’engage à rester sur la page de l’évaluation, sans changer d’onglet ni sortir du plein écran.', 'Je passe cette évaluation seul·e, sans aide extérieure ni outil non autorisé.', ].map((txt, i) => ( ))}
)}
); return content; }; Object.assign(window, { StudLogin, StudDashboard, StudPreExam });