entrainement-mercredi-2/entrainement_certification_C1.html

1827 lines
59 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>exercice d'entraînement</title>
<!-- Tabler Icons CSS & Google Fonts CDN -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@latest/tabler-icons.min.css">
<style>
@import url('https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700;800;900&family=DM+Sans:ital,wght@0,400;0,500;0,700;1,400&display=swap');
:root {
/* Theme core colors (Indigo/Violet) */
--primary-hsl: 247, 80%, 62%;
--primary: hsl(var(--primary-hsl));
--primary-light: hsl(247, 85%, 96%);
--primary-dark: hsl(247, 80%, 35%);
/* Neutral colors - Clean & Premium Cool Grays */
--bg-primary: #f8fafc;
--bg-secondary: #ffffff;
--bg-tertiary: #f1f5f9;
--color-text-primary: #0f172a;
--color-text-secondary: #475569;
--color-text-tertiary: #94a3b8;
--color-border-primary: #f1f5f9;
--color-border-secondary: #e2e8f0;
--color-border-tertiary: #e2e8f0;
--border-radius-sm: 8px;
--border-radius-md: 14px;
--border-radius-lg: 18px;
--shadow-sm: 0 1px 3px 0 rgba(0, 0, 0, 0.05), 0 1px 2px 0 rgba(0, 0, 0, 0.03);
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.04), 0 2px 4px -2px rgba(0, 0, 0, 0.04);
--shadow-lg: 0 12px 20px -3px rgba(0, 0, 0, 0.05), 0 4px 8px -4px rgba(0, 0, 0, 0.05);
/* Warning Accent (Amber) */
--color-a-bg: hsl(36, 85%, 96%);
--color-a-border: hsl(36, 80%, 88%);
--color-a-accent: hsl(36, 90%, 45%);
--color-a-dark: hsl(36, 95%, 22%);
/* Success Green (Emerald) */
--color-g-bg: hsl(162, 85%, 96%);
--color-g-border: hsl(162, 80%, 90%);
--color-g-accent: hsl(162, 75%, 34%);
--color-g-dark: hsl(162, 80%, 20%);
/* Typography */
--font-sans: 'DM Sans', sans-serif;
--font-heading: 'Nunito', sans-serif;
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
background-color: var(--bg-primary);
color: var(--color-text-primary);
font-family: var(--font-sans);
transition: background-color 0.3s ease, color 0.3s ease;
min-height: 100vh;
display: flex;
flex-direction: column;
background-image:
radial-gradient(at 0% 0%, hsla(247, 80%, 62%, 0.04) 0px, transparent 50%),
radial-gradient(at 100% 0%, hsla(162, 75%, 34%, 0.01) 0px, transparent 50%),
radial-gradient(at 50% 100%, hsla(36, 90%, 45%, 0.02) 0px, transparent 50%);
background-attachment: fixed;
}
.w {
max-width: 960px;
width: 100%;
margin: 0 auto;
padding: 2.5rem 24px;
flex-grow: 1;
display: flex;
flex-direction: column;
}
/* Header */
.dh {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1.5rem;
border-bottom: 1px solid var(--color-border-secondary);
padding-bottom: 1.5rem;
margin-bottom: 2rem;
}
.dk {
font-size: 0.75rem;
font-weight: 800;
letter-spacing: .2em;
text-transform: uppercase;
color: var(--primary);
margin-bottom: 8px;
}
.dt {
font-size: 2rem;
font-weight: 900;
color: var(--color-text-primary);
line-height: 1.2;
letter-spacing: -0.02em;
font-family: var(--font-heading);
}
/* Identity input cards */
.identity-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px;
margin-bottom: 2rem;
}
.id-field {
display: flex;
flex-direction: column;
gap: 6px;
background: var(--bg-secondary);
border: 1px solid var(--color-border-secondary);
border-radius: var(--border-radius-md);
padding: 10px 14px;
box-shadow: var(--shadow-sm);
transition: all 0.25s ease;
}
.id-field:focus-within {
border-color: var(--primary);
box-shadow: 0 0 0 3px hsla(247, 80%, 62%, 0.12), var(--shadow-md);
}
.field-label {
font-size: 0.65rem;
font-weight: 800;
letter-spacing: .1em;
text-transform: uppercase;
color: var(--color-text-secondary);
font-family: var(--font-heading);
}
.field-line {
border: none;
background: transparent;
font-family: var(--font-sans);
font-size: 0.9rem;
color: var(--color-text-primary);
padding: 2px 0 0 0;
width: 100%;
outline: none;
}
.field-line::placeholder {
color: var(--color-text-tertiary);
opacity: 0.7;
}
/* Badge */
.hbadge {
background: var(--primary-light);
border: 1px solid var(--color-border-secondary);
border-radius: var(--border-radius-md);
padding: 8px 18px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 4px;
box-shadow: var(--shadow-md);
transition: all 0.3s ease;
flex-shrink: 0;
text-align: center;
}
.hbadge:hover {
transform: translateY(-2px);
box-shadow: var(--shadow-lg);
}
.hbt {
font-size: 0.65rem;
font-weight: 800;
letter-spacing: .08em;
text-transform: uppercase;
color: var(--primary-dark);
opacity: 0.8;
}
.hbv {
font-size: 1.2rem;
font-weight: 900;
color: var(--primary-dark);
line-height: 1.1;
font-family: var(--font-heading);
}
/* Score Strip */
.score-strip {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 12px;
margin-bottom: 2rem;
}
.sc {
background: var(--bg-secondary);
border: 1px solid var(--color-border-secondary);
border-radius: var(--border-radius-md);
padding: 12px;
text-align: center;
box-shadow: var(--shadow-sm);
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
gap: 4px;
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.sc:hover {
transform: translateY(-2px);
box-shadow: var(--shadow-md);
}
.sc-l {
font-size: 0.7rem;
font-weight: 800;
text-transform: uppercase;
letter-spacing: .05em;
color: var(--color-text-secondary);
}
.sc-v {
font-size: 1.5rem;
font-weight: 900;
color: var(--color-text-primary);
font-family: var(--font-heading);
}
.sc-v.green {
color: var(--color-g-accent);
}
/* Notice Block */
.notice {
background: var(--primary-light);
border-left: 4px solid var(--primary);
border-radius: 0 var(--border-radius-md) var(--border-radius-md) 0;
padding: 14px 20px;
margin-bottom: 2rem;
display: flex;
gap: 12px;
align-items: flex-start;
box-shadow: var(--shadow-sm);
}
.notice i {
color: var(--primary);
font-size: 1.3rem;
flex-shrink: 0;
margin-top: 1px;
}
.notice p {
font-size: 0.9rem;
color: var(--color-text-secondary);
line-height: 1.6;
font-family: var(--font-sans);
}
.notice strong {
font-weight: 800;
color: var(--primary-dark);
}
/* Exercise Blocks */
.ex-block {
margin-bottom: 2.5rem;
background: var(--bg-secondary);
border: 1px solid var(--color-border-secondary);
border-radius: var(--border-radius-lg);
overflow: hidden;
box-shadow: var(--shadow-sm);
transition: box-shadow 0.25s ease;
}
.ex-block:hover {
box-shadow: var(--shadow-md);
}
.ex-head {
display: flex;
align-items: center;
gap: 16px;
padding: 16px 20px;
border-bottom: 1px solid var(--color-border-secondary);
}
.ex-icon {
width: 40px;
height: 40px;
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.3rem;
flex-shrink: 0;
box-shadow: var(--shadow-sm);
}
.ex-meta {
flex: 1;
display: flex;
flex-direction: column;
}
.ex-num {
font-size: 0.65rem;
font-weight: 800;
letter-spacing: .1em;
text-transform: uppercase;
color: var(--color-text-tertiary);
margin-bottom: 2px;
}
.ex-title {
font-size: 1.15rem;
font-weight: 900;
font-family: var(--font-heading);
}
.ex-pts {
font-family: var(--font-heading);
font-size: 0.75rem;
font-weight: 800;
letter-spacing: .05em;
text-transform: uppercase;
border-radius: 8px;
padding: 6px 12px;
white-space: nowrap;
box-shadow: var(--shadow-sm);
}
/* Dynamic styling per exercise theme */
.ex-block:has(.ei1) .ex-head {
background: var(--primary-light);
border-bottom-color: var(--color-border-secondary);
}
.ex-block:has(.ei1) .ex-icon {
background: hsl(247, 85%, 90%);
color: var(--primary);
}
.ex-block:has(.ei1) .ex-title {
color: var(--primary-dark);
}
.ex-block:has(.ei1) .ex-pts {
background: var(--primary-light);
color: var(--primary);
border: 1px solid hsl(247, 85%, 90%);
}
.ex-block:has(.ei2) .ex-head {
background: var(--color-a-bg);
border-bottom-color: var(--color-a-border);
}
.ex-block:has(.ei2) .ex-icon {
background: hsl(36, 85%, 90%);
color: var(--color-a-accent);
}
.ex-block:has(.ei2) .ex-title {
color: var(--color-a-dark);
}
.ex-block:has(.ei2) .ex-pts {
background: var(--color-a-bg);
color: var(--color-a-accent);
border: 1px solid var(--color-a-border);
}
.ex-block:has(.ei3) .ex-head {
background: var(--color-g-bg);
border-bottom-color: var(--color-g-border);
}
.ex-block:has(.ei3) .ex-icon {
background: hsl(162, 85%, 90%);
color: var(--color-g-accent);
}
.ex-block:has(.ei3) .ex-title {
color: var(--color-g-dark);
}
.ex-block:has(.ei3) .ex-pts {
background: var(--color-g-bg);
color: var(--color-g-accent);
border: 1px solid var(--color-g-border);
}
.ex-body {
padding: 20px;
}
/* Case Description Block */
.cas-box {
background: var(--bg-tertiary);
border: 1px solid var(--color-border-secondary);
border-radius: var(--border-radius-md);
padding: 14px 18px;
margin-bottom: 1.5rem;
box-shadow: var(--shadow-sm);
}
.cas-lbl {
font-size: 0.7rem;
font-weight: 800;
letter-spacing: .08em;
text-transform: uppercase;
color: var(--color-text-secondary);
margin-bottom: 8px;
display: flex;
align-items: center;
gap: 8px;
}
.cas-lbl i {
font-size: 1.1rem;
color: var(--primary);
}
.ex-block:has(.ei2) .cas-lbl i {
color: var(--color-a-accent);
}
.ex-block:has(.ei3) .cas-lbl i {
color: var(--color-g-accent);
}
.cas-text {
font-size: 0.9rem;
color: var(--color-text-primary);
line-height: 1.6;
font-family: var(--font-sans);
}
.cas-text strong {
font-weight: 800;
color: var(--primary-dark);
}
.ex-block:has(.ei2) .cas-text strong {
color: var(--color-a-dark);
}
.ex-block:has(.ei3) .cas-text strong {
color: var(--color-g-dark);
}
/* Instructions */
.consigne {
font-size: 0.85rem;
color: var(--color-text-secondary);
line-height: 1.6;
margin-bottom: 1.5rem;
font-style: italic;
opacity: 0.9;
}
/* Questions and MCQ */
.qrow {
margin-bottom: 1.5rem;
}
.qlbl {
font-size: 0.95rem;
font-weight: 800;
color: var(--color-text-primary);
margin-bottom: 10px;
display: flex;
align-items: flex-start;
gap: 10px;
line-height: 1.5;
}
.qnum {
width: 24px;
height: 24px;
border-radius: 50%;
background: var(--primary-light);
border: 1px solid hsl(247, 85%, 90%);
display: flex;
align-items: center;
justify-content: center;
font-size: 0.75rem;
font-weight: 800;
color: var(--primary);
flex-shrink: 0;
margin-top: 2px;
font-family: var(--font-heading);
}
.ex-block:has(.ei2) .qnum {
background: var(--color-a-bg);
border-color: var(--color-a-border);
color: var(--color-a-accent);
}
.ex-block:has(.ei3) .qnum {
background: var(--color-g-bg);
border-color: var(--color-g-border);
color: var(--color-g-accent);
}
.opts {
display: flex;
flex-direction: column;
gap: 8px;
margin-left: 34px;
}
.opt {
display: flex;
align-items: flex-start;
gap: 12px;
padding: 10px 16px;
border: 1px solid var(--color-border-secondary);
border-radius: var(--border-radius-md);
cursor: pointer;
background: var(--bg-secondary);
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: var(--shadow-sm);
}
.opt:hover {
border-color: var(--primary);
background: var(--primary-light);
transform: translateY(-1px);
box-shadow: var(--shadow-md);
}
.ex-block:has(.ei2) .opt:hover {
border-color: var(--color-a-accent);
background: var(--color-a-bg);
}
.ex-block:has(.ei3) .opt:hover {
border-color: var(--color-g-accent);
background: var(--color-g-bg);
}
/* MCQ Option States */
.opt.selected {
background: var(--primary-light);
border-color: var(--primary);
box-shadow: var(--shadow-md);
}
.ex-block:has(.ei2) .opt.selected {
background: var(--color-a-bg);
border-color: var(--color-a-accent);
}
.ex-block:has(.ei3) .opt.selected {
background: var(--color-g-bg);
border-color: var(--color-g-accent);
}
.opt.correct {
background: var(--color-g-bg) !important;
border-color: var(--color-g-accent) !important;
box-shadow: var(--shadow-md) !important;
}
.opt.wrong {
background: hsl(0, 85%, 97%) !important;
border-color: hsl(0, 80%, 88%) !important;
box-shadow: var(--shadow-md) !important;
}
.opt-radio {
width: 18px;
height: 18px;
border-radius: 50%;
border: 2px solid var(--color-text-tertiary);
flex-shrink: 0;
margin-top: 2px;
display: flex;
align-items: center;
justify-content: center;
background: var(--bg-secondary);
transition: all 0.2s ease;
}
.opt.selected .opt-radio {
border-color: var(--primary);
}
.ex-block:has(.ei2) .opt.selected .opt-radio {
border-color: var(--color-a-accent);
}
.ex-block:has(.ei3) .opt.selected .opt-radio {
border-color: var(--color-g-accent);
}
.opt.correct .opt-radio {
border-color: var(--color-g-accent) !important;
background: var(--color-g-accent) !important;
}
.opt.wrong .opt-radio {
border-color: hsl(0, 75%, 45%) !important;
background: hsl(0, 75%, 45%) !important;
}
.opt-dot {
width: 8px;
height: 8px;
border-radius: 50%;
background: transparent;
transition: background 0.2s ease;
}
.opt.selected .opt-dot {
background: var(--primary);
}
.ex-block:has(.ei2) .opt.selected .opt-dot {
background: var(--color-a-accent);
}
.ex-block:has(.ei3) .opt.selected .opt-dot {
background: var(--color-g-accent);
}
.opt.correct .opt-dot,
.opt.wrong .opt-dot {
background: #ffffff !important;
}
.opt-text {
font-size: 0.9rem;
color: var(--color-text-primary);
line-height: 1.5;
font-family: var(--font-sans);
}
.opt.correct .opt-text {
color: var(--color-g-dark);
font-weight: 700;
}
.opt.wrong .opt-text {
color: hsl(0, 95%, 22%);
}
/* Textarea styling */
.ta {
width: 100%;
border: 1px solid var(--color-border-secondary);
border-radius: var(--border-radius-md);
background: var(--bg-primary);
font-family: var(--font-sans);
font-size: 0.9rem;
color: var(--color-text-primary);
padding: 10px 14px;
resize: vertical;
outline: none;
line-height: 1.55;
transition: all 0.25s ease;
margin-left: 34px;
width: calc(100% - 34px);
}
.ta:focus {
border-color: var(--primary);
background: var(--bg-secondary);
box-shadow: 0 0 0 3px hsla(247, 80%, 62%, 0.12);
}
.ta::placeholder {
color: var(--color-text-tertiary);
font-style: italic;
opacity: 0.7;
}
/* Drag and Drop Zone */
.drag-zone {
margin-left: 34px;
margin-bottom: 1.5rem;
}
.drag-items {
display: flex;
flex-wrap: wrap;
gap: 8px;
padding: 14px;
background: var(--bg-tertiary);
border: 1px solid var(--color-border-secondary);
border-radius: var(--border-radius-md);
margin-bottom: 1rem;
min-height: 56px;
box-shadow: var(--shadow-sm) inset;
}
.drag-item {
padding: 6px 14px;
background: var(--primary-light);
border: 1px solid hsl(247, 85%, 90%);
border-radius: 20px;
font-size: 0.85rem;
font-weight: 700;
color: var(--primary-dark);
cursor: grab;
user-select: none;
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: var(--shadow-sm);
}
.drag-item:hover:not(.placed) {
transform: translateY(-2px);
box-shadow: var(--shadow-md);
background: var(--primary);
color: white;
border-color: var(--primary);
}
.drag-item.placed {
opacity: 0.35;
cursor: not-allowed;
transform: none;
box-shadow: none;
}
.drop-slots {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 12px;
}
.drop-slot {
border: 1px dashed var(--color-border-secondary);
background: var(--bg-secondary);
border-radius: var(--border-radius-md);
padding: 12px 14px;
min-height: 80px;
display: flex;
flex-direction: column;
gap: 6px;
transition: all 0.25s ease;
box-shadow: var(--shadow-sm);
}
.drop-slot:hover {
border-color: var(--color-a-accent);
background: var(--color-a-bg);
}
.slot-lbl {
font-size: 0.65rem;
font-weight: 800;
letter-spacing: .08em;
text-transform: uppercase;
color: var(--color-text-secondary);
margin-bottom: 2px;
}
.slot-content {
display: flex;
flex-wrap: wrap;
gap: 6px;
}
.placed-tag {
padding: 5px 12px;
background: var(--color-a-bg);
border: 1px solid var(--color-a-border);
border-radius: 20px;
font-size: 0.8rem;
font-weight: 700;
color: var(--color-a-dark);
cursor: pointer;
transition: all 0.2s ease;
box-shadow: var(--shadow-sm);
}
.placed-tag:hover {
background: #fee2e2;
color: #ef4444;
border-color: #fca5a5;
box-shadow: 0 2px 4px rgba(239, 68, 68, 0.1);
}
.placed-tag.correct {
background: var(--color-g-bg) !important;
border-color: var(--color-g-accent) !important;
color: var(--color-g-dark) !important;
}
.placed-tag.wrong {
background: hsl(0, 85%, 97%) !important;
border-color: hsl(0, 80%, 88%) !important;
color: hsl(0, 95%, 22%) !important;
}
.slot-ph {
font-size: 0.8rem;
color: var(--color-text-tertiary);
font-style: italic;
margin-top: 4px;
}
/* Buttons & Actions */
.ex-actions {
display: flex;
align-items: center;
gap: 12px;
margin-top: 1.5rem;
}
.act-btn {
font-family: var(--font-heading);
font-size: 0.75rem;
font-weight: 800;
letter-spacing: .08em;
text-transform: uppercase;
border-radius: 10px;
padding: 8px 16px;
cursor: pointer;
display: flex;
align-items: center;
gap: 8px;
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: var(--shadow-sm);
}
.ab-check {
background: var(--primary);
border: 1px solid var(--primary);
color: white;
}
.ab-check:hover {
background: var(--primary-dark);
border-color: var(--primary-dark);
transform: translateY(-2px);
box-shadow: 0 4px 8px rgba(117, 95, 236, 0.25);
}
.ex-block:has(.ei3) .ab-check {
background: var(--color-g-accent);
border-color: var(--color-g-accent);
}
.ex-block:has(.ei3) .ab-check:hover {
background: var(--color-g-dark);
border-color: var(--color-g-dark);
box-shadow: 0 4px 8px rgba(16, 185, 129, 0.25);
}
.ab-reset {
background: var(--bg-secondary);
border: 1px solid var(--color-border-secondary);
color: var(--color-text-secondary);
}
.ab-reset:hover {
background: var(--bg-tertiary);
color: var(--color-text-primary);
transform: translateY(-2px);
}
/* Result Badges */
.result-badge {
display: none;
align-items: center;
gap: 8px;
font-family: var(--font-heading);
font-size: 0.8rem;
font-weight: 800;
padding: 8px 16px;
border-radius: var(--border-radius-md);
margin-left: auto;
box-shadow: var(--shadow-sm);
}
.rb-ok {
background: var(--color-g-bg);
border: 1px solid var(--color-g-border);
color: var(--color-g-dark);
}
.rb-ko {
background: hsl(0, 85%, 96%);
border: 1px solid hsl(0, 80%, 88%);
color: hsl(0, 95%, 22%);
}
/* Debrief / Corrective Panel */
.corrige-btn {
font-family: var(--font-heading);
font-size: 0.75rem;
font-weight: 800;
letter-spacing: .08em;
text-transform: uppercase;
background: var(--bg-secondary);
border: 1px solid var(--color-border-secondary);
border-radius: 10px;
padding: 8px 16px;
cursor: pointer;
color: var(--color-text-secondary);
margin-top: 1.5rem;
display: inline-flex;
align-items: center;
gap: 8px;
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: var(--shadow-sm);
}
.corrige-btn:hover {
background: var(--bg-tertiary);
color: var(--color-text-primary);
transform: translateY(-2px);
}
.corrige-btn.revealed {
background: var(--color-g-bg);
border-color: var(--color-g-accent);
color: var(--color-g-dark);
}
.corrige-panel {
display: none;
margin-top: 1rem;
background: var(--color-g-bg);
border: 1px solid var(--color-g-border);
border-radius: var(--border-radius-md);
padding: 16px 20px;
box-shadow: var(--shadow-sm);
}
.corrige-panel.visible {
display: block;
animation: slideDown 0.3s ease-out;
}
@keyframes slideDown {
from { opacity: 0; transform: translateY(-8px); }
to { opacity: 1; transform: translateY(0); }
}
.cp-title {
font-size: 0.75rem;
font-weight: 800;
letter-spacing: .1em;
text-transform: uppercase;
color: var(--color-g-dark);
margin-bottom: 10px;
display: flex;
align-items: center;
gap: 8px;
}
.cp-item {
font-size: 0.85rem;
color: var(--color-g-dark);
display: flex;
align-items: flex-start;
gap: 10px;
line-height: 1.6;
margin-bottom: 8px;
font-family: var(--font-sans);
}
.cp-item:last-child {
margin-bottom: 0;
}
.cp-item::before {
content: '✓';
color: var(--color-g-accent);
font-weight: 800;
flex-shrink: 0;
}
/* Print & Bottom Layout */
.print-row {
display: flex;
justify-content: flex-end;
margin-top: 2rem;
}
.pbtn {
font-family: var(--font-heading);
font-size: 0.75rem;
font-weight: 800;
letter-spacing: .08em;
text-transform: uppercase;
background: var(--primary);
border: 1px solid var(--primary);
color: white;
border-radius: 10px;
padding: 10px 18px;
cursor: pointer;
display: flex;
align-items: center;
gap: 8px;
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: var(--shadow-sm);
}
.pbtn:hover {
background: var(--primary-dark);
border-color: var(--primary-dark);
transform: translateY(-2px);
box-shadow: 0 4px 8px rgba(117, 95, 236, 0.25);
}
/* Responsive CSS Overrides */
@media (max-width: 860px) {
.w {
padding: 1.5rem 16px;
}
.dh {
flex-direction: column;
align-items: stretch;
gap: 1rem;
}
.identity-row {
grid-template-columns: 1fr;
gap: 12px;
}
.dt {
font-size: 1.6rem;
}
.score-strip {
grid-template-columns: 1fr 1fr;
gap: 8px;
}
.drop-slots {
grid-template-columns: 1fr;
gap: 12px;
}
.opts {
margin-left: 0;
}
.drag-zone {
margin-left: 0;
}
.ta {
margin-left: 0;
width: 100%;
}
.ex-actions {
flex-wrap: wrap;
}
.result-badge {
margin-left: 0;
width: 100%;
justify-content: center;
}
}
/* Print Styles Overrides */
@media print {
body {
background: white !important;
color: black !important;
-webkit-print-color-adjust: exact;
print-color-adjust: exact;
}
.id-field {
border: 1px solid #94a3b8 !important;
background: white !important;
box-shadow: none !important;
}
.pbtn, .act-btn, .corrige-btn {
display: none !important;
}
.ex-block, .corrige-panel {
page-break-inside: avoid;
border: 1px solid #94a3b8 !important;
background: white !important;
box-shadow: none !important;
}
.opt {
border: 1px solid #94a3b8 !important;
background: white !important;
box-shadow: none !important;
}
.drag-items {
display: none !important;
}
}
</style>
</head>
<body>
<div class="w">
<h2 style="position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)">Entraînement :
utiliser les outils IA générative dans un cadre professionnel, 3 exercices progressifs avec corrigés</h2>
<div class="dh">
<div>
<div class="dk">Mercredi 2 · Entraînement </div>
<div class="dt">Utiliser l'IA générative en contexte professionnel</div>
</div>
<div class="hbadge">
<div class="hbt">Durée</div>
<div class="hbv">~35 min</div>
</div>
</div>
<div class="identity-row">
<div class="id-field">
<span class="field-label">Nom</span>
<input class="field-line" type="text" placeholder="Entrez votre nom" id="student-lastname" />
</div>
<div class="id-field">
<span class="field-label">Prénom</span>
<input class="field-line" type="text" placeholder="Entrez votre prénom" id="student-firstname" />
</div>
</div>
<div class="score-strip">
<div class="sc">
<div class="sc-l">Exercice 1</div>
<div class="sc-v" id="sc1">-/4</div>
</div>
<div class="sc">
<div class="sc-l">Exercice 2</div>
<div class="sc-v" id="sc2">-/6</div>
</div>
<div class="sc">
<div class="sc-l">Exercice 3</div>
<div class="sc-v" id="sc3">-/6</div>
</div>
<div class="sc">
<div class="sc-l">Total</div>
<div class="sc-v green" id="sct">-/16</div>
</div>
</div>
<div class="notice">
<i class="ti ti-info-circle" aria-hidden="true"></i>
<p>Cet entraînement couvre les 3 chapitres de l'UF1. <strong>3 exercices progressifs</strong> : repérage des types
d'IA, sélection d'outils pour un cas métier, et élaboration d'une feuille de route. Le corrigé est disponible
après chaque exercice. Durée conseillée : 35 min.</p>
</div>
<div class="ex-block">
<div class="ex-head">
<div class="ex-icon ei1"><i class="ti ti-brain" aria-hidden="true"></i></div>
<div class="ex-meta">
<div class="ex-num">Exercice 1 · UF1 Ch.1 · 8 min</div>
<div class="ex-title">Identifier les types d'IA et leurs caractéristiques</div>
</div>
<span class="ex-pts">4 pts</span>
</div>
<div class="ex-body">
<div class="consigne">Pour chaque affirmation, cochez la réponse correcte. Une seule bonne réponse par question.
</div>
<div class="qrow">
<div class="qlbl">
<div class="qnum">1</div>Un outil comme ChatGPT est qualifié d'IA générative car il :
</div>
<div class="opts" id="q1">
<div class="opt" onclick="selectOpt(this,'q1','a')">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">Analyse des données numériques pour produire des statistiques</div>
</div>
<div class="opt" onclick="selectOpt(this,'q1','b')" data-correct="true">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">Produit du contenu nouveau (texte, image, code) à partir de patterns appris sur de
grandes quantités de données</div>
</div>
<div class="opt" onclick="selectOpt(this,'q1','c')">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">Répond uniquement à des questions fermées avec des réponses prédéfinies</div>
</div>
<div class="opt" onclick="selectOpt(this,'q1','d')">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">Remplace les décisions humaines dans les processus automatisés</div>
</div>
</div>
</div>
<div class="qrow">
<div class="qlbl">
<div class="qnum">2</div>Laquelle de ces affirmations est correcte concernant le RGPD et les outils IA ?
</div>
<div class="opts" id="q2">
<div class="opt" onclick="selectOpt(this,'q2','a')">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">Le RGPD ne s'applique pas aux IA car elles ne traitent pas de données personnelles au
sens légal</div>
</div>
<div class="opt" onclick="selectOpt(this,'q2','b')">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">Tous les outils IA sont conformes RGPD dès lors qu'ils sont hébergés en Europe</div>
</div>
<div class="opt" onclick="selectOpt(this,'q2','c')" data-correct="true">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">Il faut vérifier les conditions d'utilisation de chaque outil - certains modèles
utilisent les prompts pour réentraîner leurs modèles, ce qui pose un risque de fuite de données</div>
</div>
<div class="opt" onclick="selectOpt(this,'q2','d')">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">Le RGPD interdit l'utilisation de tout outil IA pour traiter des données clients</div>
</div>
</div>
</div>
<div class="qrow">
<div class="qlbl">
<div class="qnum">3</div>L'utilisation de l'IA pour trier automatiquement des CV lors d'un recrutement est :
</div>
<div class="opts" id="q3">
<div class="opt" onclick="selectOpt(this,'q3','a')">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">Recommandée car elle est plus objective que le jugement humain</div>
</div>
<div class="opt" onclick="selectOpt(this,'q3','b')" data-correct="true">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">Encadrée par la loi : elle nécessite transparence, information des candidats et
supervision humaine obligatoire</div>
</div>
<div class="opt" onclick="selectOpt(this,'q3','c')">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">Totalement interdite en France depuis 2023</div>
</div>
<div class="opt" onclick="selectOpt(this,'q3','d')">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">Autorisée sans restriction dès lors que l'outil utilisé est certifié</div>
</div>
</div>
</div>
<div class="qrow">
<div class="qlbl">
<div class="qnum">4</div>Laquelle de ces tâches est la plus adaptée à une délégation à l'IA générative ?
</div>
<div class="opts" id="q4">
<div class="opt" onclick="selectOpt(this,'q4','a')">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">Prendre la décision finale d'accorder un crédit bancaire à un client</div>
</div>
<div class="opt" onclick="selectOpt(this,'q4','b')">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">Évaluer la fiabilité d'un témoignage lors d'une procédure judiciaire</div>
</div>
<div class="opt" onclick="selectOpt(this,'q4','c')" data-correct="true">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">Rédiger un premier jet de réponse à un email client récurrent, relu et validé ensuite
par un humain</div>
</div>
<div class="opt" onclick="selectOpt(this,'q4','d')">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">Établir un diagnostic médical à partir des symptômes d'un patient</div>
</div>
</div>
</div>
<div class="ex-actions">
<button class="act-btn ab-check" onclick="checkEx1()"><i class="ti ti-check" aria-hidden="true"></i>
Vérifier</button>
<button class="act-btn ab-reset" onclick="resetEx1()"><i class="ti ti-refresh" aria-hidden="true"></i>
Réinitialiser</button>
<div class="result-badge" id="rb1"></div>
</div>
</div>
</div>
<div class="ex-block">
<div class="ex-head">
<div class="ex-icon ei2"><i class="ti ti-tool" aria-hidden="true"></i></div>
<div class="ex-meta">
<div class="ex-num">Exercice 2 · UF1 Ch.2 · 12 min</div>
<div class="ex-title">Sélectionner et justifier les outils IA pour un cas métier</div>
</div>
<span class="ex-pts">6 pts</span>
</div>
<div class="ex-body">
<div class="cas-box">
<div class="cas-lbl"><i class="ti ti-briefcase" aria-hidden="true"></i>Cas - Responsable communication dans une
PME agroalimentaire (12 salariés)</div>
<div class="cas-text">Marie est responsable communication dans une PME qui fabrique des confitures artisanales.
Elle doit <strong>produire du contenu régulier pour les réseaux sociaux</strong> (3 posts/semaine),
<strong>rédiger des fiches produits</strong> pour le site e-commerce, et <strong>créer des visuels</strong>
pour les campagnes saisonnières. Elle travaille seule, sans graphiste ni rédacteur. Son budget outils est
limité. Elle utilise déjà Microsoft 365.</div>
</div>
<div class="consigne">Pour chacun des 3 besoins de Marie, classez les outils proposés dans la bonne catégorie.
Faites glisser chaque outil vers la colonne correspondante.</div>
<div class="drag-zone">
<div
style="font-size:10px;font-weight:500;letter-spacing:.08em;text-transform:uppercase;color:var(--color-text-tertiary);margin-bottom:6px;">
Outils disponibles - faites glisser</div>
<div class="drag-items" id="drag-pool">
<div class="drag-item" draggable="true" ondragstart="dragStart(event)" data-val="ChatGPT">ChatGPT</div>
<div class="drag-item" draggable="true" ondragstart="dragStart(event)" data-val="Copilot">Copilot (Microsoft)
</div>
<div class="drag-item" draggable="true" ondragstart="dragStart(event)" data-val="Midjourney">Midjourney</div>
<div class="drag-item" draggable="true" ondragstart="dragStart(event)" data-val="Firefly">Adobe Firefly</div>
<div class="drag-item" draggable="true" ondragstart="dragStart(event)" data-val="Gemini">Gemini</div>
<div class="drag-item" draggable="true" ondragstart="dragStart(event)" data-val="Mistral">Mistral</div>
<div class="drag-item" draggable="true" ondragstart="dragStart(event)" data-val="Flux">Flux / Ideogram</div>
</div>
<div class="drop-slots">
<div class="drop-slot" ondragover="event.preventDefault()" ondrop="dropTo(event,'redac')" id="slot-redac">
<div class="slot-lbl">Rédaction posts & fiches</div>
<div class="slot-content" id="sc-redac"><span class="slot-ph">Déposez ici</span></div>
</div>
<div class="drop-slot" ondragover="event.preventDefault()" ondrop="dropTo(event,'visuel')" id="slot-visuel">
<div class="slot-lbl">Création visuels</div>
<div class="slot-content" id="sc-visuel"><span class="slot-ph">Déposez ici</span></div>
</div>
<div class="drop-slot" ondragover="event.preventDefault()" ondrop="dropTo(event,'integre')" id="slot-integre">
<div class="slot-lbl">Intégration M365</div>
<div class="slot-content" id="sc-integre"><span class="slot-ph">Déposez ici</span></div>
</div>
</div>
</div>
<div class="qrow" style="margin-top:14px;">
<div class="qlbl">
<div class="qnum">5</div>Parmi ces critères, lequel est prioritaire pour Marie lorsqu'elle choisit un outil IA
?
</div>
<div class="opts" id="q5">
<div class="opt" onclick="selectOpt(this,'q5','a')">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">La puissance du modèle (nombre de paramètres)</div>
</div>
<div class="opt" onclick="selectOpt(this,'q5','b')" data-correct="true">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">L'intégration avec ses outils existants, le coût, et la conformité RGPD pour les
données clients</div>
</div>
<div class="opt" onclick="selectOpt(this,'q5','c')">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">La notoriété de l'outil dans son secteur professionnel</div>
</div>
<div class="opt" onclick="selectOpt(this,'q5','d')">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">La disponibilité d'une version mobile de l'outil</div>
</div>
</div>
</div>
<div class="ex-actions">
<button class="act-btn ab-check" onclick="checkEx2()"><i class="ti ti-check" aria-hidden="true"></i>
Vérifier</button>
<button class="act-btn ab-reset" onclick="resetEx2()"><i class="ti ti-refresh" aria-hidden="true"></i>
Réinitialiser</button>
<div class="result-badge" id="rb2"></div>
</div>
<button class="corrige-btn" id="cbtn2" onclick="toggleCorrige('c2','cbtn2')"><i class="ti ti-eye"
aria-hidden="true"></i> Voir le corrigé</button>
<div class="corrige-panel" id="c2">
<div class="cp-title"><i class="ti ti-check" aria-hidden="true"></i>Corrigé - exercice 2</div>
<div class="cp-item">Rédaction posts & fiches : ChatGPT, Gemini ou Mistral - les 3 sont pertinents. Mistral est
souverain (hébergement EU) ce qui est un avantage pour les données clients. Gemini s'intègre à Google
Workspace si Marie l'utilise.</div>
<div class="cp-item">Création visuels : Midjourney (qualité artistique élevée), Adobe Firefly (intégré Creative
Cloud, safe pour le droit d'auteur), ou Flux/Ideogram (gratuit ou peu coûteux, bon pour les visuels produits).
Pour une PME avec budget limité, Firefly ou Flux/Ideogram sont à privilégier.</div>
<div class="cp-item">Intégration M365 : Copilot - c'est sa force principale. Pour une structure qui utilise déjà
Word, Outlook et Teams, c'est le choix le plus rationnel. Pas besoin d'apprendre un nouvel outil.</div>
<div class="cp-item">Question 5 : B. Pour une petite structure comme Marie, l'intégration aux outils existants +
le coût + la conformité RGPD (données clients sensibles dans l'alimentaire) priment sur la puissance brute du
modèle.</div>
</div>
</div>
</div>
<div class="ex-block">
<div class="ex-head">
<div class="ex-icon ei3"><i class="ti ti-map" aria-hidden="true"></i></div>
<div class="ex-meta">
<div class="ex-num">Exercice 3 · UF1 Ch.3 · 15 min</div>
<div class="ex-title">Construire une feuille de route IA pour une structure</div>
</div>
<span class="ex-pts">6 pts</span>
</div>
<div class="ex-body">
<div class="cas-box">
<div class="cas-lbl"><i class="ti ti-building" aria-hidden="true"></i>Cas - Directrice d'un centre de formation
(35 salariés)</div>
<div class="cas-text">Sophie dirige un organisme de formation professionnelle. Elle a participé à une
démonstration IA et souhaite lancer un projet d'intégration. Elle identifie <strong>3 usages
potentiels</strong> : automatiser les relances administratives (convocations, émargements), aider les
formateurs à créer des supports de cours, et analyser les évaluations de fin de formation pour identifier des
axes d'amélioration. Elle dispose d'un budget limité et d'une équipe peu familière avec les outils numériques.
</div>
</div>
<div class="consigne">Répondez aux 3 questions suivantes pour construire une feuille de route réaliste pour
Sophie.</div>
<div class="qrow">
<div class="qlbl">
<div class="qnum">6</div>Dans quel ordre logique Sophie devrait-elle déployer ces 3 usages ? Justifiez
brièvement.
</div>
<div class="opts" id="q6">
<div class="opt" onclick="selectOpt(this,'q6','a')" data-correct="true">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">1. Relances administratives → 2. Supports de cours → 3. Analyse des évaluations - du
plus simple et à faible risque vers le plus complexe</div>
</div>
<div class="opt" onclick="selectOpt(this,'q6','b')">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">1. Analyse des évaluations → 2. Supports de cours → 3. Relances - commencer par
l'usage à plus forte valeur ajoutée stratégique</div>
</div>
<div class="opt" onclick="selectOpt(this,'q6','c')">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">Déployer les 3 simultanément pour maximiser le retour sur investissement</div>
</div>
<div class="opt" onclick="selectOpt(this,'q6','d')">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">1. Supports de cours → 2. Analyse → 3. Relances - en commençant par les formateurs qui
sont les plus engagés</div>
</div>
</div>
</div>
<div class="qrow">
<div class="qlbl">
<div class="qnum">7</div>Quel est le principal frein à anticiper dans cette structure, et comment le traiter ?
</div>
<div class="opts" id="q7">
<div class="opt" onclick="selectOpt(this,'q7','a')">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">Le coût des outils - résoudre avec un appel à projet ou une subvention OPCO</div>
</div>
<div class="opt" onclick="selectOpt(this,'q7','b')" data-correct="true">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">La résistance au changement d'une équipe peu familière avec le numérique - traiter
avec une montée en compétences progressive, des ambassadeurs internes, et des victoires rapides visibles
</div>
</div>
<div class="opt" onclick="selectOpt(this,'q7','c')">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">Le manque d'outils adaptés au secteur de la formation - attendre que le marché mûrisse
</div>
</div>
<div class="opt" onclick="selectOpt(this,'q7','d')">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">Les enjeux de propriété intellectuelle sur les supports de cours générés par IA</div>
</div>
</div>
</div>
<div class="qrow">
<div class="qlbl">
<div class="qnum">8</div>Dans la feuille de route, à quel moment Sophie doit-elle aborder la question RGPD
avec son équipe ?
</div>
<div class="opts" id="q8">
<div class="opt" onclick="selectOpt(this,'q8','a')">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">Après le déploiement du premier usage, une fois que l'équipe est à l'aise avec les
outils</div>
</div>
<div class="opt" onclick="selectOpt(this,'q8','b')">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">Seulement pour l'usage "analyse des évaluations" car c'est le seul qui implique des
données personnelles</div>
</div>
<div class="opt" onclick="selectOpt(this,'q8','c')" data-correct="true">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">Dès la phase de cadrage - avant tout déploiement, pour tous les usages, car les 3
manipulent des données relatives à des personnes (stagiaires, formateurs)</div>
</div>
<div class="opt" onclick="selectOpt(this,'q8','d')">
<div class="opt-radio">
<div class="opt-dot"></div>
</div>
<div class="opt-text">Uniquement si un audit externe est requis par son financeur</div>
</div>
</div>
</div>
<div class="ex-actions">
<button class="act-btn ab-check" onclick="checkEx3()"><i class="ti ti-check" aria-hidden="true"></i>
Vérifier</button>
<button class="act-btn ab-reset" onclick="resetEx3()"><i class="ti ti-refresh" aria-hidden="true"></i>
Réinitialiser</button>
<div class="result-badge" id="rb3"></div>
</div>
<button class="corrige-btn" id="cbtn3" onclick="toggleCorrige('c3','cbtn3')" style="margin-top:14px;"><i
class="ti ti-eye" aria-hidden="true"></i> Voir le corrigé détaillé</button>
<div class="corrige-panel" id="c3">
<div class="cp-title"><i class="ti ti-check" aria-hidden="true"></i>Corrigé - exercice 3</div>
<div class="cp-item">Q6 - A. Commencer par les relances administratives : tâche répétitive, faible enjeu,
résultat visible rapidement. C'est la "victoire rapide" qui crée la confiance dans l'outil et réduit la
résistance pour les usages suivants. Déployer les 3 simultanément dans une structure peu digitalisée est une
erreur fréquente qui génère de la confusion et de l'abandon.</div>
<div class="cp-item">Q7 - B. La résistance au changement est le frein n°1 dans les structures peu digitalisées.
Les clés : partir d'un usage concret et utile (pas d'une conférence sur l'IA), identifier 1 ou 2 formateurs
enthousiastes comme ambassadeurs, montrer des résultats tangibles rapidement. Le coût est un faux problème :
les outils gratuits ou peu coûteux suffisent pour les 3 usages cités.</div>
<div class="cp-item">Q8 - C. Les 3 usages manipulent des données personnelles : les convocations et émargements
contiennent les noms et coordonnées des stagiaires, les supports de cours peuvent inclure des données métier
sensibles, et les évaluations sont nominatives. Le RGPD s'applique dès la phase de cadrage, pas après coup.
</div>
</div>
</div>
</div>
<div class="print-row">
<button class="pbtn" onclick="window.print()"><i class="ti ti-printer" aria-hidden="true"></i> Imprimer</button>
</div>
</div>
<script>
const ANSWERS = { q1: 'b', q2: 'c', q3: 'b', q4: 'c', q5: 'b', q6: 'a', q7: 'b', q8: 'c' };
const SCORES = { ex1: 0, ex3: 0 };
function selectOpt(el, qid, val) {
const group = document.getElementById(qid);
group.querySelectorAll('.opt').forEach(o => { o.classList.remove('selected', 'correct', 'wrong'); });
el.classList.add('selected');
el._val = val;
}
function checkGroup(qids) {
let score = 0;
qids.forEach(qid => {
const group = document.getElementById(qid);
const sel = group.querySelector('.opt.selected');
if (!sel) return;
const correct = group.querySelector('[data-correct="true"]');
if (sel === correct) { sel.classList.remove('selected'); sel.classList.add('correct'); score++; }
else { sel.classList.remove('selected'); sel.classList.add('wrong'); if (correct) correct.classList.add('correct'); }
});
return score;
}
function checkEx1() {
const s = checkGroup(['q1', 'q2', 'q3', 'q4']);
document.getElementById('sc1').textContent = s + '/4';
const rb = document.getElementById('rb1');
rb.style.display = 'flex'; rb.className = 'result-badge ' + (s >= 3 ? 'rb-ok' : 'rb-ko');
rb.innerHTML = (s >= 3 ? '<i class="ti ti-check"></i>' : ' <i class="ti ti-x"></i>') + ' ' + s + '/4';
updateTotal();
}
function resetEx1() {
['q1', 'q2', 'q3', 'q4'].forEach(qid => {
document.getElementById(qid).querySelectorAll('.opt').forEach(o => o.classList.remove('selected', 'correct', 'wrong'));
});
document.getElementById('sc1').textContent = '-/4';
document.getElementById('rb1').style.display = 'none';
updateTotal();
}
function checkEx3() {
const s = checkGroup(['q6', 'q7', 'q8']);
const score = s * 2;
document.getElementById('sc3').textContent = score + '/6';
const rb = document.getElementById('rb3');
rb.style.display = 'flex'; rb.className = 'result-badge ' + (score >= 4 ? 'rb-ok' : 'rb-ko');
rb.innerHTML = (score >= 4 ? '<i class="ti ti-check"></i>' : ' <i class="ti ti-x"></i>') + ' ' + score + '/6';
updateTotal();
}
function resetEx3() {
['q6', 'q7', 'q8'].forEach(qid => {
document.getElementById(qid).querySelectorAll('.opt').forEach(o => o.classList.remove('selected', 'correct', 'wrong'));
});
document.getElementById('sc3').textContent = '-/6';
document.getElementById('rb3').style.display = 'none';
updateTotal();
}
function checkEx2() {
const mapping = {
'ChatGPT': 'redac',
'Gemini': 'redac',
'Mistral': 'redac',
'Midjourney': 'visuel',
'Firefly': 'visuel',
'Flux': 'visuel',
'Copilot': 'integre'
};
let correctPlacements = 0;
['redac', 'visuel', 'integre'].forEach(slot => {
const sc = document.getElementById('sc-' + slot);
const tags = sc.querySelectorAll('.placed-tag');
tags.forEach(tag => {
const val = tag.textContent.trim();
if (mapping[val] === slot) {
tag.classList.remove('wrong');
tag.classList.add('correct');
correctPlacements++;
} else {
tag.classList.remove('correct');
tag.classList.add('wrong');
}
});
});
const q5 = document.getElementById('q5');
const sel = q5.querySelector('.opt.selected');
let q5Score = 0;
if (sel) {
const correct = q5.querySelector('[data-correct="true"]');
if (sel === correct) {
sel.classList.remove('selected');
sel.classList.add('correct');
q5Score = 1;
} else {
sel.classList.remove('selected');
sel.classList.add('wrong');
if (correct) correct.classList.add('correct');
}
}
const dragScore = Math.round((correctPlacements / 7) * 5);
const totalScore = dragScore + q5Score;
document.getElementById('sc2').textContent = totalScore + '/6';
const rb = document.getElementById('rb2');
rb.style.display = 'flex';
rb.className = 'result-badge ' + (totalScore >= 4 ? 'rb-ok' : 'rb-ko');
rb.innerHTML = (totalScore >= 4 ? '<i class="ti ti-check"></i>' : ' <i class="ti ti-x"></i>') + ' ' + totalScore + '/6';
updateTotal();
}
function resetEx2() {
document.querySelectorAll('#drag-pool .drag-item').forEach(item => {
item.classList.remove('placed');
});
['redac', 'visuel', 'integre'].forEach(slot => {
const sc = document.getElementById('sc-' + slot);
sc.innerHTML = '<span class="slot-ph">Déposez ici</span>';
});
document.getElementById('q5').querySelectorAll('.opt').forEach(o => {
o.classList.remove('selected', 'correct', 'wrong');
});
document.getElementById('sc2').textContent = '-/6';
document.getElementById('rb2').style.display = 'none';
const p = document.getElementById('c2');
const b = document.getElementById('cbtn2');
p.classList.remove('visible');
b.classList.remove('revealed');
b.innerHTML = '<i class="ti ti-eye" aria-hidden="true"></i> Voir le corrigé';
updateTotal();
}
function updateTotal() {
const s1 = document.getElementById('sc1').textContent;
const s2 = document.getElementById('sc2').textContent;
const s3 = document.getElementById('sc3').textContent;
const v1 = s1.startsWith('-') ? null : parseInt(s1);
const v2 = s2.startsWith('-') ? null : parseInt(s2);
const v3 = s3.startsWith('-') ? null : parseInt(s3);
let t = 0;
let activeCount = 0;
if (v1 !== null) { t += v1; activeCount++; }
if (v2 !== null) { t += v2; activeCount++; }
if (v3 !== null) { t += v3; activeCount++; }
const el = document.getElementById('sct');
if (activeCount > 0) {
el.textContent = t + '/16';
el.className = 'sc-v' + (t >= 10 ? ' green' : '');
} else {
el.textContent = '-/16';
el.className = 'sc-v';
}
}
function toggleCorrige(panelId, btnId) {
const p = document.getElementById(panelId);
const b = document.getElementById(btnId);
const visible = p.classList.contains('visible');
p.classList.toggle('visible', !visible);
b.classList.toggle('revealed', !visible);
b.innerHTML = visible ? '<i class="ti ti-eye" aria-hidden="true"></i> Voir le corrigé' : '<i class="ti ti-eye-off" aria-hidden="true"></i> Masquer le corrigé';
}
let dragged = null;
function dragStart(e) { dragged = e.target; }
function dropTo(e, slot) {
e.preventDefault();
if (!dragged) return;
const sc = document.getElementById('sc-' + slot);
const ph = sc.querySelector('.slot-ph');
if (ph) ph.remove();
const tag = document.createElement('span');
tag.className = 'placed-tag';
tag.textContent = dragged.getAttribute('data-val');
tag.onclick = () => {
const val = tag.textContent.trim();
const poolItem = document.querySelector(`#drag-pool .drag-item[data-val="${val}"]`);
if (poolItem) poolItem.classList.remove('placed');
tag.remove();
const slotEl = sc;
if (!slotEl.children.length) { const p = document.createElement('span'); p.className = 'slot-ph'; p.textContent = 'Déposez ici'; slotEl.appendChild(p); }
};
sc.appendChild(tag);
dragged.classList.add('placed');
dragged = null;
}
// Auto-save & load for student name and firstname
document.addEventListener('DOMContentLoaded', () => {
const lastnameEl = document.getElementById('student-lastname');
const firstnameEl = document.getElementById('student-firstname');
const savedLastname = localStorage.getItem('student_lastname');
const savedFirstname = localStorage.getItem('student_firstname');
if (savedLastname) lastnameEl.value = savedLastname;
if (savedFirstname) firstnameEl.value = savedFirstname;
lastnameEl.addEventListener('input', () => {
localStorage.setItem('student_lastname', lastnameEl.value);
});
firstnameEl.addEventListener('input', () => {
localStorage.setItem('student_firstname', firstnameEl.value);
});
});
</script>
</body>
</html>