Georevision / app.py
Enoder's picture
Create app.py
6e4ecb0 verified
Raw
History Blame
61.6 kB
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GรฉoRรฉvision โ€” Tectonique des Plaques</title>
<link href="https://fonts.googleapis.com/css2?family=Space+Mono:ital,wght@0,400;0,700;1,400&family=Syne:wght@400;700;800&display=swap" rel="stylesheet">
<style>
:root {
--bg: #0a0c14;
--surface: #111420;
--surface2: #181d2e;
--accent: #e8440a;
--accent2: #3a7bd5;
--accent3: #22c97a;
--gold: #f5c842;
--text: #e8e6e0;
--muted: #6b7090;
--border: #252a3d;
--ch3: #e8440a;
--ch4: #3a7bd5;
--ch5: #22c97a;
--synth: #f5c842;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: 'Space Mono', monospace;
background: var(--bg);
color: var(--text);
min-height: 100vh;
overflow-x: hidden;
}
/* โ”€โ”€ BACKGROUND โ”€โ”€ */
body::before {
content: '';
position: fixed;
inset: 0;
background:
radial-gradient(ellipse 60% 40% at 15% 20%, rgba(232,68,10,0.08) 0%, transparent 60%),
radial-gradient(ellipse 50% 50% at 85% 80%, rgba(58,123,213,0.07) 0%, transparent 60%),
radial-gradient(ellipse 40% 40% at 50% 50%, rgba(34,201,122,0.04) 0%, transparent 60%);
pointer-events: none;
z-index: 0;
}
.wrap { position: relative; z-index: 1; max-width: 900px; margin: 0 auto; padding: 0 20px 60px; }
/* โ”€โ”€ HEADER โ”€โ”€ */
header {
padding: 40px 0 30px;
border-bottom: 1px solid var(--border);
margin-bottom: 30px;
}
.header-top { display: flex; align-items: baseline; gap: 16px; flex-wrap: wrap; }
header h1 {
font-family: 'Syne', sans-serif;
font-weight: 800;
font-size: clamp(2rem, 5vw, 3.2rem);
letter-spacing: -2px;
line-height: 1;
}
header h1 span { color: var(--accent); }
.subtitle { font-size: 0.75rem; color: var(--muted); letter-spacing: 2px; text-transform: uppercase; margin-top: 8px; }
.science-tag {
background: var(--surface2);
border: 1px solid var(--border);
border-radius: 4px;
padding: 4px 10px;
font-size: 0.65rem;
color: var(--gold);
letter-spacing: 1px;
text-transform: uppercase;
}
/* โ”€โ”€ STATS BAR โ”€โ”€ */
.stats-bar {
display: flex; gap: 20px; flex-wrap: wrap;
background: var(--surface);
border: 1px solid var(--border);
border-radius: 8px;
padding: 16px 20px;
margin-bottom: 24px;
}
.stat { display: flex; flex-direction: column; gap: 2px; }
.stat-val { font-family: 'Syne', sans-serif; font-weight: 700; font-size: 1.5rem; }
.stat-label { font-size: 0.62rem; color: var(--muted); text-transform: uppercase; letter-spacing: 1px; }
.stat-val.green { color: var(--accent3); }
.stat-val.red { color: var(--accent); }
.stat-val.blue { color: var(--accent2); }
.stat-val.gold { color: var(--gold); }
/* โ”€โ”€ NAV TABS โ”€โ”€ */
.tabs {
display: flex; gap: 4px;
background: var(--surface);
border: 1px solid var(--border);
border-radius: 8px;
padding: 4px;
margin-bottom: 24px;
overflow-x: auto;
}
.tab {
flex: 1; min-width: 80px;
padding: 10px 14px;
background: transparent;
border: none;
color: var(--muted);
font-family: 'Space Mono', monospace;
font-size: 0.7rem;
cursor: pointer;
border-radius: 6px;
transition: all .2s;
white-space: nowrap;
text-transform: uppercase;
letter-spacing: 1px;
}
.tab.active {
background: var(--accent);
color: white;
}
.tab:hover:not(.active) { background: var(--surface2); color: var(--text); }
/* โ”€โ”€ SCREENS โ”€โ”€ */
.screen { display: none; }
.screen.active { display: block; }
/* โ”€โ”€ CHAPTER FILTER โ”€โ”€ */
.filter-row {
display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 20px;
}
.filter-btn {
padding: 6px 14px;
border-radius: 20px;
border: 1px solid var(--border);
background: transparent;
color: var(--muted);
font-family: 'Space Mono', monospace;
font-size: 0.68rem;
cursor: pointer;
transition: all .2s;
}
.filter-btn.active { color: white; border-color: transparent; }
.filter-btn[data-ch="all"].active { background: var(--muted); }
.filter-btn[data-ch="3"].active { background: var(--ch3); }
.filter-btn[data-ch="4"].active { background: var(--ch4); }
.filter-btn[data-ch="5"].active { background: var(--ch5); }
.filter-btn[data-ch="synth"].active { background: var(--synth); color: #000; }
/* โ”€โ”€ FLASHCARD โ”€โ”€ */
.flashcard-zone {
perspective: 1200px;
margin-bottom: 20px;
}
.card-wrap {
width: 100%;
min-height: 260px;
position: relative;
transform-style: preserve-3d;
transition: transform .5s cubic-bezier(.4,0,.2,1);
cursor: pointer;
}
.card-wrap.flipped { transform: rotateY(180deg); }
.card-face {
position: absolute; inset: 0;
backface-visibility: hidden;
border-radius: 12px;
padding: 36px 40px;
display: flex;
flex-direction: column;
justify-content: center;
min-height: 260px;
}
.card-front {
background: var(--surface);
border: 1px solid var(--border);
}
.card-back {
background: var(--surface2);
border: 1px solid var(--border);
transform: rotateY(180deg);
}
.card-chapter {
font-size: 0.6rem;
text-transform: uppercase;
letter-spacing: 2px;
margin-bottom: 16px;
font-weight: 700;
}
.card-number {
position: absolute;
top: 16px; right: 20px;
font-size: 0.65rem;
color: var(--muted);
}
.card-question {
font-family: 'Syne', sans-serif;
font-size: clamp(1rem, 2.5vw, 1.3rem);
font-weight: 700;
line-height: 1.4;
color: var(--text);
}
.card-hint {
margin-top: 12px;
font-size: 0.7rem;
color: var(--muted);
font-style: italic;
}
.card-answer {
font-size: clamp(0.85rem, 2vw, 1rem);
line-height: 1.7;
color: var(--text);
}
.card-answer strong { color: var(--gold); }
.card-flip-hint {
position: absolute;
bottom: 16px; right: 20px;
font-size: 0.6rem;
color: var(--muted);
letter-spacing: 1px;
}
/* โ”€โ”€ PROGRESS RING โ”€โ”€ */
.progress-area {
display: flex; align-items: center; gap: 20px;
background: var(--surface);
border: 1px solid var(--border);
border-radius: 8px;
padding: 16px 20px;
margin-bottom: 16px;
}
.progress-bar-outer {
flex: 1; height: 6px;
background: var(--border);
border-radius: 3px;
overflow: hidden;
}
.progress-bar-inner {
height: 100%;
border-radius: 3px;
background: linear-gradient(90deg, var(--accent), var(--gold));
transition: width .4s ease;
}
.progress-text { font-size: 0.7rem; color: var(--muted); white-space: nowrap; }
/* โ”€โ”€ CARD CONTROLS โ”€โ”€ */
.card-controls {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 10px;
margin-bottom: 24px;
}
.ctrl-btn {
padding: 12px;
border: 1px solid var(--border);
border-radius: 8px;
background: var(--surface);
color: var(--text);
font-family: 'Space Mono', monospace;
font-size: 0.72rem;
cursor: pointer;
transition: all .2s;
text-align: center;
line-height: 1.3;
}
.ctrl-btn:hover { transform: translateY(-2px); }
.ctrl-btn.bad { border-color: var(--accent); }
.ctrl-btn.bad:hover { background: var(--accent); }
.ctrl-btn.ok { border-color: var(--gold); }
.ctrl-btn.ok:hover { background: var(--gold); color: #000; }
.ctrl-btn.good { border-color: var(--accent3); }
.ctrl-btn.good:hover { background: var(--accent3); color: #000; }
.ctrl-btn.nav { border-color: var(--border); }
.ctrl-btn.nav:hover { background: var(--surface2); }
.ctrl-btn small { display: block; font-size: 0.58rem; color: var(--muted); margin-top: 2px; }
.ctrl-btn.bad small { color: rgba(232,68,10,0.7); }
.ctrl-btn.ok small { color: rgba(245,200,66,0.7); }
.ctrl-btn.good small { color: rgba(34,201,122,0.7); }
/* โ”€โ”€ QUIZ SCREEN โ”€โ”€ */
.quiz-q {
background: var(--surface);
border: 1px solid var(--border);
border-radius: 12px;
padding: 28px 32px;
margin-bottom: 16px;
}
.quiz-meta {
font-size: 0.62rem;
text-transform: uppercase;
letter-spacing: 2px;
color: var(--muted);
margin-bottom: 12px;
display: flex; justify-content: space-between; align-items: center;
}
.quiz-question {
font-family: 'Syne', sans-serif;
font-size: clamp(1rem, 2.5vw, 1.2rem);
font-weight: 700;
line-height: 1.5;
}
.quiz-options { display: flex; flex-direction: column; gap: 10px; margin-bottom: 16px; }
.quiz-opt {
padding: 14px 20px;
border: 1px solid var(--border);
border-radius: 8px;
background: var(--surface);
color: var(--text);
font-family: 'Space Mono', monospace;
font-size: 0.8rem;
cursor: pointer;
transition: all .2s;
text-align: left;
line-height: 1.4;
}
.quiz-opt:hover:not(:disabled) { border-color: var(--accent2); background: var(--surface2); }
.quiz-opt.correct { border-color: var(--accent3) !important; background: rgba(34,201,122,0.1) !important; color: var(--accent3); }
.quiz-opt.wrong { border-color: var(--accent) !important; background: rgba(232,68,10,0.1) !important; color: var(--accent); }
.quiz-opt:disabled { cursor: default; }
.quiz-feedback {
padding: 14px 20px;
border-radius: 8px;
font-size: 0.78rem;
line-height: 1.6;
margin-bottom: 16px;
display: none;
}
.quiz-feedback.show { display: block; }
.quiz-feedback.correct-fb { background: rgba(34,201,122,0.08); border: 1px solid rgba(34,201,122,0.3); color: var(--accent3); }
.quiz-feedback.wrong-fb { background: rgba(232,68,10,0.08); border: 1px solid rgba(232,68,10,0.3); color: var(--accent); }
.quiz-next {
padding: 12px 28px;
background: var(--accent);
border: none;
border-radius: 8px;
color: white;
font-family: 'Space Mono', monospace;
font-size: 0.78rem;
cursor: pointer;
display: none;
transition: all .2s;
}
.quiz-next.show { display: inline-block; }
.quiz-next:hover { background: #ff5520; transform: translateY(-1px); }
/* QUIZ RESULTS */
.quiz-result {
text-align: center;
padding: 50px 20px;
display: none;
}
.quiz-result.show { display: block; }
.result-score {
font-family: 'Syne', sans-serif;
font-size: 5rem;
font-weight: 800;
line-height: 1;
margin-bottom: 8px;
}
.result-label { font-size: 0.8rem; color: var(--muted); text-transform: uppercase; letter-spacing: 2px; margin-bottom: 24px; }
.result-msg { font-size: 1.1rem; margin-bottom: 32px; line-height: 1.6; }
.restart-btn {
padding: 14px 32px;
background: var(--accent);
border: none;
border-radius: 8px;
color: white;
font-family: 'Space Mono', monospace;
font-size: 0.82rem;
cursor: pointer;
margin: 0 6px;
transition: all .2s;
}
.restart-btn:hover { background: #ff5520; }
.restart-btn.outline {
background: transparent;
border: 1px solid var(--border);
color: var(--text);
}
.restart-btn.outline:hover { background: var(--surface2); }
/* โ”€โ”€ REVIEW MAP โ”€โ”€ */
.review-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(42px, 1fr));
gap: 6px;
margin-bottom: 24px;
}
.review-cell {
aspect-ratio: 1;
border-radius: 6px;
border: 1px solid var(--border);
background: var(--surface);
display: flex; align-items: center; justify-content: center;
font-size: 0.6rem;
color: var(--muted);
cursor: pointer;
transition: all .2s;
font-weight: 700;
}
.review-cell:hover { transform: scale(1.1); border-color: var(--accent2); }
.review-cell.status-good { background: rgba(34,201,122,0.2); border-color: var(--accent3); color: var(--accent3); }
.review-cell.status-ok { background: rgba(245,200,66,0.2); border-color: var(--gold); color: var(--gold); }
.review-cell.status-bad { background: rgba(232,68,10,0.2); border-color: var(--accent); color: var(--accent); }
.review-cell.status-unseen { opacity: 0.4; }
.legend { display: flex; gap: 16px; flex-wrap: wrap; margin-bottom: 20px; }
.legend-item { display: flex; align-items: center; gap: 6px; font-size: 0.66rem; color: var(--muted); }
.legend-dot { width: 10px; height: 10px; border-radius: 2px; }
.legend-dot.green { background: var(--accent3); }
.legend-dot.gold { background: var(--gold); }
.legend-dot.red { background: var(--accent); }
.legend-dot.grey { background: var(--surface2); border: 1px solid var(--border); }
/* โ”€โ”€ RECAP SCREEN โ”€โ”€ */
.recap-section { margin-bottom: 28px; }
.recap-title {
font-family: 'Syne', sans-serif;
font-size: 0.7rem;
text-transform: uppercase;
letter-spacing: 3px;
font-weight: 700;
padding: 8px 0;
border-bottom: 1px solid var(--border);
margin-bottom: 14px;
}
.recap-item {
padding: 12px 16px;
border-left: 3px solid var(--border);
margin-bottom: 8px;
background: var(--surface);
border-radius: 0 6px 6px 0;
font-size: 0.78rem;
line-height: 1.6;
transition: border-color .2s;
}
.recap-item:hover { border-left-color: var(--accent2); }
.recap-item .num { color: var(--muted); font-size: 0.62rem; display: block; margin-bottom: 4px; }
.recap-ch3 { border-left-color: rgba(232,68,10,0.4); }
.recap-ch4 { border-left-color: rgba(58,123,213,0.4); }
.recap-ch5 { border-left-color: rgba(34,201,122,0.4); }
.recap-synth { border-left-color: rgba(245,200,66,0.4); }
/* โ”€โ”€ ANIMATIONS โ”€โ”€ */
@keyframes fadeUp {
from { opacity: 0; transform: translateY(16px); }
to { opacity: 1; transform: translateY(0); }
}
.screen.active { animation: fadeUp .3s ease; }
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
/* โ”€โ”€ RESPONSIVE โ”€โ”€ */
@media (max-width: 600px) {
.card-controls { grid-template-columns: 1fr 1fr; }
.stats-bar { gap: 14px; }
.card-face { padding: 24px 20px; }
}
</style>
</head>
<body>
<div class="wrap">
<header>
<div class="header-top">
<h1>Gร‰O<span>Rร‰VISION</span></h1>
<span class="science-tag">Mรฉthode Ebbinghaus + Testing Effect</span>
</div>
<div class="subtitle">Tectonique des Plaques โ€” Chapitres 3, 4, 5 &amp; Synthรจse ยท 76 notions</div>
</header>
<!-- STATS -->
<div class="stats-bar">
<div class="stat"><span class="stat-val gold" id="stat-total">76</span><span class="stat-label">Notions</span></div>
<div class="stat"><span class="stat-val green" id="stat-maรฎtrisรฉ">0</span><span class="stat-label">Maรฎtrisรฉes</span></div>
<div class="stat"><span class="stat-val" style="color:var(--gold)" id="stat-appris">0</span><span class="stat-label">En cours</span></div>
<div class="stat"><span class="stat-val red" id="stat-revoir">0</span><span class="stat-label">ร€ revoir</span></div>
<div class="stat"><span class="stat-val blue" id="stat-quiz-score">โ€”</span><span class="stat-label">Score Quiz</span></div>
</div>
<!-- TABS -->
<div class="tabs">
<button class="tab active" onclick="showScreen('flashcard')">Flashcards</button>
<button class="tab" onclick="showScreen('quiz')">Quiz</button>
<button class="tab" onclick="showScreen('map')">Carte</button>
<button class="tab" onclick="showScreen('recap')">Rรฉcap. complet</button>
</div>
<!-- โ•โ•โ•โ•โ•โ•โ• FLASHCARD SCREEN โ•โ•โ•โ•โ•โ•โ• -->
<div class="screen active" id="screen-flashcard">
<div class="filter-row">
<button class="filter-btn active" data-ch="all" onclick="setFilter('all', this)">Tout (76)</button>
<button class="filter-btn" data-ch="3" onclick="setFilter('3', this)">CH.3 Mobilitรฉ (19)</button>
<button class="filter-btn" data-ch="4" onclick="setFilter('4', this)">CH.4 Divergence (21)</button>
<button class="filter-btn" data-ch="5" onclick="setFilter('5', this)">CH.5 Convergence (20)</button>
<button class="filter-btn" data-ch="synth" onclick="setFilter('synth', this)">Synthรจse (5+1)</button>
<button class="filter-btn" data-ch="weak" onclick="setFilter('weak', this)">โš  ร€ revoir</button>
</div>
<div class="progress-area">
<div class="progress-bar-outer"><div class="progress-bar-inner" id="fc-progress" style="width:0%"></div></div>
<span class="progress-text" id="fc-counter">0 / 0</span>
</div>
<div class="flashcard-zone" onclick="flipCard()">
<div class="card-wrap" id="card-wrap">
<div class="card-face card-front">
<span class="card-number" id="card-num"></span>
<div class="card-chapter" id="card-chap"></div>
<div class="card-question" id="card-q"></div>
<div class="card-hint" id="card-hint"></div>
<div class="card-flip-hint">CLIQUER POUR Rร‰Vร‰LER โ†—</div>
</div>
<div class="card-face card-back">
<span class="card-number" id="card-num2"></span>
<div class="card-chapter" id="card-chap2"></div>
<div class="card-answer" id="card-a"></div>
<div class="card-flip-hint">โ† RETOURNER</div>
</div>
</div>
</div>
<div class="card-controls" id="card-controls" style="display:none">
<button class="ctrl-btn bad" onclick="rateCard(0)">โœ— ร€ revoir<small>Je ne savais pas</small></button>
<button class="ctrl-btn ok" onclick="rateCard(1)">~ Hรฉsitant<small>Approximatif</small></button>
<button class="ctrl-btn good" onclick="rateCard(2)">โœ“ Maรฎtrisรฉ<small>Rรฉponse exacte</small></button>
</div>
<div class="card-controls" id="card-nav">
<button class="ctrl-btn nav" onclick="prevCard()">โ† Prรฉcรฉdent</button>
<button class="ctrl-btn nav" onclick="shuffleCards()">โŸณ Mรฉlanger</button>
<button class="ctrl-btn nav" onclick="nextCard()">Suivant โ†’</button>
</div>
</div>
<!-- โ•โ•โ•โ•โ•โ•โ• QUIZ SCREEN โ•โ•โ•โ•โ•โ•โ• -->
<div class="screen" id="screen-quiz">
<div class="filter-row">
<button class="filter-btn active" data-ch="all" onclick="setQuizFilter('all', this)">Tout</button>
<button class="filter-btn" data-ch="3" onclick="setQuizFilter('3', this)">CH.3</button>
<button class="filter-btn" data-ch="4" onclick="setQuizFilter('4', this)">CH.4</button>
<button class="filter-btn" data-ch="5" onclick="setQuizFilter('5', this)">CH.5</button>
<button class="filter-btn" data-ch="weak" onclick="setQuizFilter('weak', this)">โš  Faibles</button>
</div>
<div id="quiz-container">
<div class="quiz-q">
<div class="quiz-meta">
<span id="quiz-chapter-tag"></span>
<span id="quiz-progress-tag"></span>
</div>
<div class="quiz-question" id="quiz-q-text"></div>
</div>
<div class="quiz-options" id="quiz-options"></div>
<div class="quiz-feedback" id="quiz-feedback"></div>
<button class="quiz-next" id="quiz-next" onclick="nextQuiz()">Question suivante โ†’</button>
</div>
<div class="quiz-result" id="quiz-result">
<div class="result-score" id="result-score"></div>
<div class="result-label">score final</div>
<div class="result-msg" id="result-msg"></div>
<button class="restart-btn" onclick="restartQuiz()">Recommencer</button>
<button class="restart-btn outline" onclick="showScreen('flashcard')">Rรฉviser les flashcards</button>
</div>
</div>
<!-- โ•โ•โ•โ•โ•โ•โ• MAP SCREEN โ•โ•โ•โ•โ•โ•โ• -->
<div class="screen" id="screen-map">
<div class="legend">
<div class="legend-item"><div class="legend-dot green"></div>Maรฎtrisรฉ</div>
<div class="legend-item"><div class="legend-dot gold"></div>Hรฉsitant</div>
<div class="legend-item"><div class="legend-dot red"></div>ร€ revoir</div>
<div class="legend-item"><div class="legend-dot grey"></div>Non vu</div>
</div>
<div class="review-grid" id="review-grid"></div>
<p style="font-size:0.7rem;color:var(--muted)">Cliquez sur un numรฉro pour aller directement ร  la carte correspondante.</p>
</div>
<!-- โ•โ•โ•โ•โ•โ•โ• RECAP SCREEN โ•โ•โ•โ•โ•โ•โ• -->
<div class="screen" id="screen-recap">
<div id="recap-content"></div>
</div>
</div>
<script>
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
// DATA โ€” 76 cartes complรจtes
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
const CARDS = [
// CH.3 โ€” I. Les plaques et leurs frontiรจres
{id:1, ch:"3", section:"CH.3 โ€” Limites de plaques",
q:"Quels sont les 3 grands types de limites de plaques ?",
hint:"Pense : naissance / destruction / collision",
a:"<strong>Dorsales</strong> (divergence/accrรฉtion), <strong>Fosses ocรฉaniques</strong> (convergence/subduction), <strong>Chaรฎnes de montagnes</strong> (convergence/collision)."},
{id:2, ch:"3", section:"CH.3 โ€” Dorsales",
q:"Quelles roches sont produites ร  la dorsale ? Quelle est leur texture ?",
hint:"Deux roches, deux textures",
a:"<strong>Basalte</strong> (texture microlithique, refroidissement rapide en surface) et <strong>Gabbro</strong> (texture grenue, refroidissement lent en profondeur)."},
{id:3, ch:"3", section:"CH.3 โ€” Dorsales",
q:"Quel type de failles caractรฉrise les dorsales ? Pourquoi ?",
hint:"Extension ou compression ?",
a:"<strong>Failles normales</strong>, car la divergence des plaques crรฉe une extension (รฉtirement) de la croรปte."},
{id:4, ch:"3", section:"CH.3 โ€” Dorsales",
q:"Quelles sont les caractรฉristiques sismiques et thermiques d'une dorsale ?",
hint:"Profondeur + intensitรฉ + flux",
a:"Sismicitรฉ <strong>superficielle et de faible magnitude</strong>. Flux gรฉothermique <strong>รฉlevรฉ</strong> en raison du magmatisme ascendant."},
{id:5, ch:"3", section:"CH.3 โ€” Fosses",
q:"Quelles roches plutoniques et volcaniques sont produites aux zones de subduction ?",
hint:"4 roches, 2 textures diffรฉrentes",
a:"Plutoniques (grenues) : <strong>diorite, granite</strong>. Volcaniques (microlithiques) : <strong>andรฉsite, rhyolite</strong>."},
{id:6, ch:"3", section:"CH.3 โ€” Fosses",
q:"Comment se rรฉpartissent les foyers sismiques en zone de subduction ? Jusqu'oรน ?",
hint:"Un plan cรฉlรจbre",
a:"Selon le <strong>plan de Wadati-Benioff</strong> : plan inclinรฉ suivant la plaque plongeante, atteignant <strong>700 km de profondeur</strong>."},
{id:7, ch:"3", section:"CH.3 โ€” Fosses",
q:"Dรฉcris le flux gรฉothermique en zone de subduction (deux zones distinctes).",
hint:"Froid ici, chaud lร -bas",
a:"<strong>Bas</strong> au niveau de la plaque froide qui plonge. <strong>Fort</strong> au niveau de l'arc volcanique sus-jacent."},
{id:8, ch:"3", section:"CH.3 โ€” Collision",
q:"Quelles sont les caractรฉristiques gรฉologiques et sismiques d'une zone de collision ?",
hint:"Type de failles + profondeur sรฉismes",
a:"<strong>Failles inverses</strong>, flux gรฉothermique <strong>faible</strong>, sismicitรฉ principalement <strong>superficielle</strong>."},
{id:9, ch:"3", section:"CH.3 โ€” Points chauds",
q:"Comment un alignement de volcans inactifs prouve-t-il le mouvement des plaques ?",
hint:"ร‚ge + distance",
a:"Le point chaud est <strong>fixe</strong> dans le manteau profond. La plaque se dรฉplace au-dessus : l'รขge des volcans <strong>augmente avec la distance</strong> au volcan actif."},
{id:10, ch:"3", section:"CH.3 โ€” Anomalies magnรฉtiques",
q:"Qu'est-ce qu'une anomalie magnรฉtique positive vs nรฉgative ?",
hint:"Intensitรฉ mesurรฉe vs moyenne",
a:"<strong>Positive</strong> : intensitรฉ mesurรฉe > moyenne โ†’ pรฉriode de polaritรฉ normale. <strong>Nรฉgative</strong> : intensitรฉ < moyenne โ†’ pรฉriode inverse (pรดles inversรฉs)."},
{id:11, ch:"3", section:"CH.3 โ€” Anomalies magnรฉtiques",
q:"Dรฉcris le patron des anomalies magnรฉtiques autour d'une dorsale.",
hint:"Symรฉtrie + image",
a:"Bandes <strong>parallรจles et symรฉtriques</strong> par rapport ร  l'axe de la dorsale, comme un <strong>double tapis roulant</strong>. Plus les basaltes sont loin, plus ils sont vieux."},
{id:12, ch:"3", section:"CH.3 โ€” Anomalies magnรฉtiques",
q:"Que rรฉvรจle l'รขge et l'รฉpaisseur des sรฉdiments sur le plancher ocรฉanique ?",
hint:"Loi simple distance/รขge",
a:"L'รฉpaisseur et l'รขge des sรฉdiments au contact du basalte <strong>augmentent avec la distance</strong> ร  la dorsale : preuve de l'expansion ocรฉanique."},
{id:13, ch:"3", section:"CH.3 โ€” Gรฉodรฉsie",
q:"Que permet la gรฉodรฉsie spatiale (GPS) en tectonique ?",
hint:"Prรฉcision + deux types de vitesses",
a:"Localisation des stations au <strong>millimรจtre prรจs</strong>, calcul des vitesses <strong>absolues</strong> (par rapport ร  repรจres fixes) et <strong>relatives</strong> (entre deux plaques)."},
{id:14, ch:"3", section:"CH.3 โ€” Rรฉsumรฉ frontiรจres",
q:"Quelle frontiรจre prรฉsente une vallรฉe axiale (rift) ? Quel type de mouvement ?",
hint:"Rift = fossรฉ d'effondrement",
a:"La <strong>dorsale</strong> : mouvement de <strong>divergence</strong>. La vallรฉe axiale (rift) tรฉmoigne de l'extension."},
{id:15, ch:"3", section:"CH.3 โ€” Rรฉsumรฉ frontiรจres",
q:"Lithosphรจre terrestre : structure de base et activitรฉ aux frontiรจres.",
hint:"Dรฉcoupe + concentration",
a:"Dรฉcoupรฉe en <strong>plaques lithosphรฉriques rigides</strong>. Les frontiรจres concentrent l'essentiel de l'<strong>activitรฉ sismique et volcanique</strong>."},
{id:16, ch:"3", section:"CH.3 โ€” Anomalies magnรฉtiques",
q:"Comment les basaltes enregistrent-ils le champ magnรฉtique ?",
hint:"Moment clรฉ = refroidissement",
a:"En se <strong>refroidissant</strong>, les minรฉraux magnรฉtiques (magnรฉtite) se figent dans la direction du champ magnรฉtique terrestre du moment."},
{id:17, ch:"3", section:"CH.3 โ€” Dorsales",
q:"Que produit l'accrรฉtion ocรฉanique ร  la dorsale ?",
hint:"Naรฎt quoi ?",
a:"La <strong>croรปte ocรฉanique</strong> : basalte en surface + gabbro en profondeur + pรฉridotite mantellique sous-jacente."},
{id:18, ch:"3", section:"CH.3 โ€” Fosses",
q:"Qu'est-ce qu'une fosse ocรฉanique ? Quel processus y est associรฉ ?",
hint:"Plongementโ€ฆ",
a:"Dรฉpression profonde marquant une <strong>zone de subduction</strong> : plongement d'une plaque ocรฉanique dense dans le manteau."},
{id:19, ch:"3", section:"CH.3 โ€” Collision",
q:"Qu'est-ce qu'une chaรฎne de montagnes en termes tectoniques ?",
hint:"Fermeture d'un ocรฉan",
a:"Zone de <strong>collision continentale</strong> : rรฉsultat de la convergence de deux plaques continentales aprรจs fermeture d'un ocรฉan."},
// CH.4 โ€” I. Dorsales rapides
{id:20, ch:"4", section:"CH.4 โ€” Dorsales rapides",
q:"Quelle est la vitesse d'รฉcartement d'une dorsale rapide ? Exemple ?",
hint:"10โ€“16 cm/an โ€” Quel ocรฉan ?",
a:"<strong>10 ร  16 cm/an</strong>. Exemple : dorsale du Pacifique Est (Pacifique)."},
{id:21, ch:"4", section:"CH.4 โ€” Dorsales rapides",
q:"Quelle est la morphologie d'une dorsale rapide (rift, bombement) ?",
hint:"Opposรฉ de la dorsale lente",
a:"<strong>Bombement large</strong> mais <strong>vallรฉe axiale quasi absente</strong> ou peu marquรฉe (magmatisme abondant comble le rift)."},
{id:22, ch:"4", section:"CH.4 โ€” Dorsales rapides",
q:"Dรฉcris le processus de fusion partielle sous une dorsale (รฉtapes).",
hint:"Convection โ†’ dรฉcompression โ†’ solidus",
a:"<strong>1.</strong> Remontรฉe des pรฉridotites par <strong>convection</strong>. <strong>2.</strong> <strong>Dรฉcompression adiabatique</strong> : le gรฉotherme recoupe le solidus. <strong>3.</strong> <strong>Fusion partielle</strong> (~15%) โ†’ gouttelettes de magma."},
{id:23, ch:"4", section:"CH.4 โ€” Dorsales rapides",
q:"Oรน se loge la chambre magmatique sous une dorsale rapide ? Quelles roches en sortent ?",
hint:"Profondeur + 2 roches",
a:"Entre <strong>2 et 7 km</strong>. Refroidissement lent โ†’ <strong>gabbros</strong> (grenu). Remontรฉe et refroidissement rapide โ†’ <strong>basaltes</strong> (microlithique)."},
{id:24, ch:"4", section:"CH.4 โ€” Dorsales rapides",
q:"Quelle รฉpaisseur de croรปte produit une dorsale rapide ?",
hint:"Chiffre prรฉcis",
a:"Croรปte ocรฉanique rรฉguliรจre de <strong>5 ร  7 km</strong> d'รฉpaisseur."},
{id:25, ch:"4", section:"CH.4 โ€” Dorsales lentes",
q:"Quelle est la vitesse d'รฉcartement d'une dorsale lente ? Exemple ?",
hint:"1โ€“5 cm/an โ€” Quel ocรฉan ?",
a:"<strong>1 ร  5 cm/an</strong>. Exemple : dorsale mรฉdio-atlantique (Atlantique)."},
{id:26, ch:"4", section:"CH.4 โ€” Dorsales lentes",
q:"Morphologie d'une dorsale lente : rift, magmatisme, expansion.",
hint:"Opposรฉ de rapide",
a:"<strong>Rift trรจs marquรฉ</strong> avec grandes failles de dรฉtachement. Magmatisme <strong>rรฉduit et discontinu</strong>. Expansion parfois assurรฉe par <strong>รฉtirement tectonique</strong>."},
{id:27, ch:"4", section:"CH.4 โ€” Dorsales lentes",
q:"Qu'est-ce que la serpentinisation et quand se produit-elle ?",
hint:"Roche + eau + dorsale lente",
a:"Hydratation des <strong>pรฉridotites</strong> (manteau) qui remontent directement en surface faute de magmatisme. L'eau transforme l'olivine en <strong>serpentine</strong>."},
{id:28, ch:"4", section:"CH.4 โ€” Vieillissement",
q:"Qu'est-ce que le mรฉtamorphisme hydrothermal ? Quand se produit-il ?",
hint:"Eau + chaleur + minรฉraux",
a:"Transformation <strong>ร  l'รฉtat solide</strong> des minรฉraux de la croรปte ocรฉanique par infiltration d'eau de mer chauffรฉe. Produit des minรฉraux <strong>hydratรฉs</strong>."},
{id:29, ch:"4", section:"CH.4 โ€” Vieillissement",
q:"Quelle sรฉquence de faciรจs mรฉtamorphiques lors du vieillissement ocรฉanique ?",
hint:"Deux tempรฉratures, deux faciรจs",
a:"<strong>&gt; 700ยฐC</strong> : faciรจs <strong>amphibolite</strong> (hornblende). Entre <strong>500โ€“700ยฐC</strong> : faciรจs <strong>schiste vert</strong> (chlorite + actinote)."},
{id:30, ch:"4", section:"CH.4 โ€” Vieillissement",
q:"Comment รฉvolue la densitรฉ de la lithosphรจre ocรฉanique avec le temps ?",
hint:"Refroidissement โ†’ รฉpaississement โ†’ densitรฉ",
a:"La lithosphรจre <strong>se refroidit</strong>, <strong>s'รฉpaissit</strong> (l'isotherme 1300ยฐC s'approfondit), et sa <strong>densitรฉ augmente</strong> jusqu'ร  dรฉpasser celle de l'asthรฉnosphรจre."},
{id:31, ch:"4", section:"CH.4 โ€” Vieillissement",
q:"Oรน et comment naissent les fumeurs noirs ?",
hint:"Cycle eau de mer",
a:"L'eau de mer s'infiltre dans la croรปte, se <strong>rรฉchauffe</strong> au contact du magma, se charge en minรฉraux et ressort sous forme de <strong>sources hydrothermales chaudes</strong>."},
{id:32, ch:"4", section:"CH.4 โ€” Dorsales rapides",
q:"Qu'est-ce que la dรฉcompression adiabatique ? Pourquoi dรฉclenche-t-elle la fusion ?",
hint:"Pas de perte de chaleur",
a:"Remontรฉe de matรฉriel <strong>sans รฉchange de chaleur</strong> avec l'environnement. La pression baisse, le point de fusion (solidus) aussi : le gรฉotherme <strong>recoupe le solidus</strong> โ†’ fusion partielle."},
{id:33, ch:"4", section:"CH.4 โ€” Vieillissement",
q:"Quelle est la signification de l'isotherme 1300ยฐC pour la lithosphรจre ?",
hint:"Limite LAB",
a:"C'est la <strong>limite lithosphรจre-asthรฉnosphรจre (LAB)</strong>. Elle s'approfondit avec le refroidissement de la plaque qui s'รฉloigne de la dorsale."},
{id:34, ch:"4", section:"CH.4 โ€” Dorsales rapides",
q:"Basalte en coussin vs basalte en filon : quelle diffรฉrence ?",
hint:"Eau vs air",
a:"<strong>Coussin</strong> : refroidissement trรจs rapide au contact de l'eau (lave sous-marine). <strong>Filon</strong> : injection de magma dans des fissures (dykes)."},
{id:35, ch:"4", section:"CH.4 โ€” Vieillissement",
q:"Quelle minรฉralogie correspond au faciรจs schiste vert ?",
hint:"Tempรฉrature < 500ยฐC",
a:"Prรฉsence de <strong>chlorite</strong> et d'<strong>actinote</strong> (amphibole calcique) : minรฉraux hydratรฉs de basse tempรฉrature."},
{id:36, ch:"4", section:"CH.4 โ€” Dorsales lentes",
q:"Pourquoi une dorsale lente a-t-elle un rift trรจs marquรฉ ?",
hint:"Magma insuffisant pourโ€ฆ",
a:"Le magmatisme est trop faible pour <strong>combler l'espace crรฉรฉ par l'รฉcartement</strong>. L'extension tectonique forme donc un <strong>fossรฉ d'effondrement profond</strong>."},
{id:37, ch:"4", section:"CH.4 โ€” Vieillissement",
q:"Quelle transformation minรฉrale correspond au faciรจs amphibolite ?",
hint:"Pyroxรจne + Plagioclase โ†’ ?",
a:"L'assemblage initial <strong>pyroxรจne + plagioclase</strong> (gabbro) se transforme en <strong>hornblende</strong> (amphibole) sous l'action de l'hydrothermalisme > 700ยฐC."},
{id:38, ch:"4", section:"CH.4 โ€” Dorsales rapides",
q:"La pรฉridotite fond entiรจrement sous une dorsale ? Quel pourcentage ?",
hint:"Partielle !",
a:"Non : seulement <strong>fusion partielle (~15%)</strong>. Le reste reste ร  l'รฉtat solide. C'est le liquide qui monte former la croรปte."},
{id:39, ch:"4", section:"CH.4 โ€” Dorsales rapides",
q:"Quel est le rรดle de la convection mantellique dans le fonctionnement d'une dorsale ?",
hint:"Mouvement ascendant",
a:"La <strong>convection</strong> (mouvements de matiรจre du manteau chaud) assure la <strong>remontรฉe des pรฉridotites</strong> sous la dorsale, dรฉclenchant la dรฉcompression et la fusion."},
{id:40, ch:"4", section:"CH.4 โ€” Dorsales lentes",
q:"Qu'est-ce qu'une faille de dรฉtachement aux dorsales lentes ?",
hint:"Grande faille, faible pendage",
a:"Grande <strong>faille ร  faible pendage</strong> (presque horizontale) permettant l'exhumation de roches profondes (pรฉridotites) directement sur le plancher ocรฉanique."},
// CH.5 โ€” Zones de convergence
{id:41, ch:"5", section:"CH.5 โ€” Marqueurs de subduction",
q:"Quels sont les 3 marqueurs principaux d'une zone de subduction ?",
hint:"1 relief / 1 alignement / 1 sรฉismique",
a:"<strong>1.</strong> Fosse ocรฉanique profonde. <strong>2.</strong> Alignement volcanique (arc insulaire ou cordillรจre). <strong>3.</strong> Plan de Wadati-Benioff (sismicitรฉ profonde)."},
{id:42, ch:"5", section:"CH.5 โ€” Marqueurs de subduction",
q:"Pourquoi la sismicitรฉ suit-elle un plan inclinรฉ en subduction ?",
hint:"Rigiditรฉ de la plaque",
a:"La plaque ocรฉanique reste <strong>rigide</strong> en plongeant (elle est froide). Les contraintes gรฉnรจrent des sรฉismes le long du plan de contact : le <strong>plan de Wadati-Benioff</strong>."},
{id:43, ch:"5", section:"CH.5 โ€” Magmatisme de subduction",
q:"Pourquoi le volcanisme de subduction est-il explosif ?",
hint:"Composition du magma",
a:"Le magma est riche en <strong>silice</strong> (trรจs visqueux) et en <strong>gaz dissous</strong>. La viscositรฉ empรชche le dรฉgazage progressif โ†’ explosion violente."},
{id:44, ch:"5", section:"CH.5 โ€” Magmatisme de subduction",
q:"Quelle est la chaรฎne de rรฉactions menant au volcanisme de subduction ?",
hint:"Eau โ†’ pรฉridotite โ†’ magma",
a:"<strong>1.</strong> Mรฉtamorphisme de subduction โ†’ libรฉration d'<strong>eau</strong>. <strong>2.</strong> L'eau monte dans le <strong>coin mantellique</strong>. <strong>3.</strong> Elle abaisse le point de fusion des pรฉridotites. <strong>4.</strong> <strong>Fusion partielle</strong> โ†’ magma โ†’ volcanisme."},
{id:45, ch:"5", section:"CH.5 โ€” Magmatisme de subduction",
q:"Quelles sont les 4 roches de subduction et leur texture ?",
hint:"2 volcaniques + 2 plutoniques",
a:"Volcaniques (microlithique) : <strong>andรฉsite, rhyolite</strong>. Plutoniques (grenue) : <strong>diorite, granite</strong>."},
{id:46, ch:"5", section:"CH.5 โ€” Magmatisme de subduction",
q:"Pourquoi existe-t-il une telle diversitรฉ de roches en subduction ?",
hint:"2 processus",
a:"<strong>Cristallisation fractionnรฉe</strong> (diffรฉrenciation du magma en refroidissant) et <strong>contamination</strong> par la croรปte continentale traversรฉe."},
{id:47, ch:"5", section:"CH.5 โ€” Magmatisme de subduction",
q:"Quel est le signe minรฉralogique caractรฉristique des roches de subduction ?",
hint:"OH dans les minรฉraux",
a:"Prรฉsence de <strong>minรฉraux hydratรฉs</strong> portant des groupements <strong>OH</strong> (ex. : amphibole, biotite, muscovite)."},
{id:48, ch:"5", section:"CH.5 โ€” Mรฉtamorphisme de subduction",
q:"Quelle sรฉquence de faciรจs mรฉtamorphiques subit la plaque subduite ?",
hint:"3 faciรจs successifs",
a:"<strong>Schiste vert</strong> โ†’ <strong>schiste bleu</strong> (apparition de glaucophane, HP-BT) โ†’ <strong>รฉclogite</strong> (grenat + jadรฉite, > 50 km)."},
{id:49, ch:"5", section:"CH.5 โ€” Mรฉtamorphisme de subduction",
q:"Quelle minรฉralogie caractรฉrise le faciรจs schiste bleu ?",
hint:"Minรฉral bleu, HP-BT",
a:"Prรฉsence de <strong>glaucophane</strong> (amphibole sodique bleue), indicateur de conditions <strong>Haute Pression โ€“ Basse Tempรฉrature</strong>."},
{id:50, ch:"5", section:"CH.5 โ€” Mรฉtamorphisme de subduction",
q:"Quelle minรฉralogie caractรฉrise le faciรจs รฉclogite et ร  quelle profondeur ?",
hint:"> 50 km",
a:"<strong>Grenat</strong> + <strong>jadรฉite</strong> (pyroxรจne sodique), formรฉs ร  partir de > <strong>50 km</strong> de profondeur sous trรจs haute pression."},
{id:51, ch:"5", section:"CH.5 โ€” Mรฉtamorphisme de subduction",
q:"En quoi le contexte P-T de la subduction est-il unique ?",
hint:"Comparer avec mรฉtamorphisme classique",
a:"<strong>Haute Pression / Basse Tempรฉrature</strong> : la plaque s'enfonce vite et reste froide โ€” contraire du mรฉtamorphisme de contact (BT/BP) ou de collision."},
{id:52, ch:"5", section:"CH.5 โ€” Moteur de la tectonique",
q:"Quel est le moteur principal du mouvement des plaques ?",
hint:"Force de tirage",
a:"La <strong>traction de la plaque subduite</strong> (froide et dense) : elle tire la plaque par gravitรฉ, entraรฎnant les mouvements descendants de la <strong>convection mantellique</strong>."},
{id:53, ch:"5", section:"CH.5 โ€” Moteur de la tectonique",
q:"Quel lien y a-t-il entre subduction et convection mantellique ?",
hint:"Cause-consรฉquence",
a:"La subduction <strong>entretient</strong> les courants descendants froids de la convection. Les plaques ne sont pas portรฉes passivement : elles <strong>tirent activement</strong> sur le reste de la lithosphรจre."},
{id:54, ch:"5", section:"CH.5 โ€” Collision",
q:"Comment se produit une collision continentale ?",
hint:"Aprรจs quoi ?",
a:"Aprรจs la <strong>fermeture complรจte d'un ocรฉan</strong> par subduction : les deux marges continentales entrent en contact et ne peuvent plus plonger (croรปte trop lรฉgรจre)."},
{id:55, ch:"5", section:"CH.5 โ€” Collision",
q:"Quelles structures gรฉologiques tรฉmoignent d'une collision en surface ?",
hint:"3 structures",
a:"<strong>Plis</strong>, <strong>failles inverses</strong> et <strong>nappes de charriage</strong> (grandes masses de roches dรฉplacรฉes horizontalement)."},
{id:56, ch:"5", section:"CH.5 โ€” Collision",
q:"Qu'est-ce qu'une racine crustale ? ร€ quelle profondeur descend le Moho ?",
hint:"Iceberg crustal",
a:"ร‰paississement de la croรปte vers le bas : le <strong>Moho</strong> peut descendre jusqu'ร  <strong>70 km</strong> (normal : ~35 km). C'est le pendant souterrain des reliefs รฉlevรฉs."},
{id:57, ch:"5", section:"CH.5 โ€” Collision",
q:"Quels types de roches mรฉtamorphiques se forment en contexte de collision ?",
hint:"Roches foliรฉes",
a:"Roches <strong>foliรฉes</strong> : <strong>micaschistes</strong> (faible ร  modรฉrรฉ mรฉtamorphisme) et <strong>gneiss</strong> (fort mรฉtamorphisme)."},
{id:58, ch:"5", section:"CH.5 โ€” Marqueurs de subduction",
q:"Quelle diffรฉrence entre arc insulaire et cordillรจre en subduction ?",
hint:"Ocรฉanโ€“Ocรฉan vs Ocรฉanโ€“Continent",
a:"<strong>Arc insulaire</strong> : subduction Ocรฉan/Ocรฉan โ†’ volcanisme en mer. <strong>Cordillรจre</strong> : subduction Ocรฉan/Continent โ†’ volcanisme en bordure de continent."},
{id:59, ch:"5", section:"CH.5 โ€” Magmatisme de subduction",
q:"Qu'est-ce que le coin mantellique et quel est son rรดle ?",
hint:"Wedge",
a:"Portion du <strong>manteau de la plaque chevauchante</strong> entre les deux plaques. Il reรงoit l'<strong>eau libรฉrรฉe</strong> par la plaque subduite โ†’ sa pรฉridotite fond partiellement."},
{id:60, ch:"5", section:"CH.5 โ€” Magmatisme de subduction",
q:"Risque volcanique caractรฉristique des zones de subduction ?",
hint:"Nuage mortel",
a:"Les <strong>nuรฉes ardentes</strong> (coulรฉes pyroclastiques) : mรฉlanges brรปlants de gaz, cendres et dรฉbris ร  trรจs grande vitesse. Liรฉ ร  la viscositรฉ รฉlevรฉe du magma."},
// SYNTHรˆSE
{id:61, ch:"synth", section:"SYNTHรˆSE โ€” Cycle lithosphรฉrique",
q:"Rรฉsume en 5 รฉtapes le cycle de la lithosphรจre ocรฉanique.",
hint:"Naissance โ†’ mort",
a:"<strong>1.</strong> Naissance ร  la <strong>dorsale</strong> (HT, BP). <strong>2.</strong> Hydratation + refroidissement (schistes verts). <strong>3.</strong> Densification โ†’ <strong>subduction</strong>. <strong>4.</strong> Mรฉtamorphisme HP-BT (schiste bleu โ†’ รฉclogite) + libรฉration d'eau. <strong>5.</strong> Dรฉclenchement du <strong>magmatisme</strong> โ†’ croรปte continentale."},
{id:62, ch:"synth", section:"SYNTHรˆSE โ€” Moteur",
q:"Quel processus assure la continuitรฉ de la convection mantellique globale ?",
hint:"Traction + plongement",
a:"La <strong>traction de la plaque plongeante</strong> (slab pull) : force gravitaire exercรฉe par la plaque froide et dense, moteur principal du cycle convectif global."},
{id:63, ch:"synth", section:"SYNTHรˆSE โ€” Eau",
q:"Quel est le rรดle de l'eau dans le cycle de la lithosphรจre ?",
hint:"Partout : dorsale โ†’ subduction",
a:"ร€ la <strong>dorsale</strong> : hydratation hydrothermal (schistes verts). En <strong>subduction</strong> : expulsion par mรฉtamorphisme โ†’ abaissement du solidus des pรฉridotites โ†’ magmatisme."},
{id:64, ch:"synth", section:"SYNTHรˆSE โ€” Cycle lithosphรฉrique",
q:"Oรน naรฎt et oรน meurt la lithosphรจre ocรฉanique ?",
hint:"Deux lieux opposรฉs",
a:"<strong>Naissance</strong> ร  la <strong>dorsale</strong> (accrรฉtion). <strong>Mort</strong> ร  la <strong>fosse de subduction</strong> (rรฉintรฉgration dans le manteau)."},
{id:65, ch:"synth", section:"SYNTHรˆSE โ€” Croรปte continentale",
q:"Comment la croรปte continentale est-elle crรฉรฉe via la subduction ?",
hint:"Eau โ†’ fusion โ†’ granite",
a:"L'eau libรฉrรฉe dรฉclenche la fusion du coin mantellique โ†’ magma riche en silice โ†’ volcanisme + intrusions โ†’ <strong>granite et diorite</strong> constituant la croรปte continentale."},
// Notions complรฉmentaires extraites du texte
{id:66, ch:"3", section:"CH.3 โ€” Anomalies magnรฉtiques",
q:"Qu'est-ce qu'une polaritรฉ magnรฉtique normale vs inverse ?",
hint:"Pรดles Nord et Sud",
a:"<strong>Normale</strong> : orientation actuelle (pรดle magnรฉtique Nord โ‰ˆ pรดle gรฉographique Nord). <strong>Inverse</strong> : pรดles <strong>Nord et Sud magnรฉtiques inversรฉs</strong>."},
{id:67, ch:"4", section:"CH.4 โ€” Vieillissement",
q:"Pourquoi la lithosphรจre ocรฉanique devient-elle plus dense avec le temps ?",
hint:"Refroidissement + manteau",
a:"En se refroidissant, elle intรจgre du manteau refroidi par sa base, et les minรฉraux se contractent. La densitรฉ dรฉpasse finalement celle de l'<strong>asthรฉnosphรจre</strong> sous-jacente (~3,3 g/cmยณ)."},
{id:68, ch:"5", section:"CH.5 โ€” Mรฉtamorphisme de subduction",
q:"Pourquoi dit-on que le mรฉtamorphisme de subduction est HP-BT ?",
hint:"Vitesse d'enfouissement",
a:"La plaque <strong>s'enfonce rapidement</strong> : la pression augmente vite mais la plaque froide ne se rรฉchauffe pas assez rapidement โ†’ conditions de <strong>Haute Pression, Basse Tempรฉrature</strong>."},
{id:69, ch:"5", section:"CH.5 โ€” Collision",
q:"Pourquoi la croรปte continentale ne peut-elle pas subduire ?",
hint:"Densitรฉ vs manteau",
a:"La croรปte continentale est <strong>moins dense</strong> (~2,7 g/cmยณ) que le manteau (~3,3 g/cmยณ) : elle flotte et ne peut pas plonger. C'est ce qui provoque la <strong>collision</strong>."},
{id:70, ch:"4", section:"CH.4 โ€” Dorsales rapides",
q:"Qu'est-ce que le gรฉotherme et le solidus dans le contexte des dorsales ?",
hint:"Deux courbes sur un graphique P-T",
a:"Le <strong>gรฉotherme</strong> dรฉcrit la tempรฉrature en fonction de la profondeur. Le <strong>solidus</strong> est la courbe en dessous de laquelle la roche est solide. Quand le gรฉotherme <strong>recoupe le solidus</strong>, la roche fond."},
{id:71, ch:"3", section:"CH.3 โ€” Rรฉsumรฉ gรฉnรฉral",
q:"Quels indices prouvent l'expansion ocรฉanique (3 types) ?",
hint:"Magnรฉtique + sรฉdimentaire + gรฉodรฉsique",
a:"<strong>1.</strong> Anomalies magnรฉtiques symรฉtriques. <strong>2.</strong> ร‚ge/รฉpaisseur croissants des sรฉdiments. <strong>3.</strong> Mesures GPS (gรฉodรฉsie spatiale)."},
{id:72, ch:"4", section:"CH.4 โ€” Dorsales rapides",
q:"Quelle est la composition minรฉralogique initiale d'un gabbro (avant mรฉtamorphisme) ?",
hint:"2 minรฉraux principaux",
a:"<strong>Pyroxรจne</strong> (clinopyroxรจne) + <strong>plagioclase</strong> (feldspath calcique). Ces minรฉraux sont remplacรฉs par hornblende puis chlorite + actinote lors du mรฉtamorphisme hydrothermal."},
{id:73, ch:"5", section:"CH.5 โ€” Marqueurs de subduction",
q:"Quelle force initie le mouvement de la plaque vers la fosse ?",
hint:"Densitรฉ + gravitรฉ",
a:"La plaque ocรฉanique vieillie est <strong>plus dense que l'asthรฉnosphรจre</strong>. La gravitรฉ provoque son <strong>plongement spontanรฉ</strong> (slab pull), qui tire le reste de la plaque."},
{id:74, ch:"5", section:"CH.5 โ€” Magmatisme de subduction",
q:"Quelle roche est l'รฉquivalent plutonique de l'andรฉsite ?",
hint:"Roche ร  grain visible",
a:"La <strong>diorite</strong> : mรชme composition mais refroidissement lent en profondeur โ†’ texture <strong>grenue</strong> (cristaux visibles ร  l'ล“il nu)."},
{id:75, ch:"4", section:"CH.4 โ€” Vieillissement",
q:"ร€ quelle tempรฉrature se place la limite faciรจs amphibolite / faciรจs schiste vert ?",
hint:"Deux seuils de tempรฉrature",
a:"<strong>Amphibolite</strong> : > 700ยฐC. <strong>Schiste vert</strong> : entre 300 et 500ยฐC. La transition se fait autour de <strong>500โ€“700ยฐC</strong>."},
{id:76, ch:"synth", section:"SYNTHรˆSE โ€” Cycle lithosphรฉrique",
q:"Cite les 3 faciรจs de mรฉtamorphisme qui jalonnent le parcours d'une plaque ocรฉanique du rifting ร  l'arc volcanique.",
hint:"Dorsale โ†’ plaque รขgรฉe โ†’ subduction",
a:"<strong>Schiste vert</strong> (hydrothermalisme dorsale et vieillissement). <strong>Schiste bleu</strong> (dรฉbut subduction, HP-BT). <strong>ร‰clogite</strong> (subduction profonde > 50 km)."},
];
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
// STATE
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
let cardStatus = {}; // id -> 0 (bad) | 1 (ok) | 2 (good)
let currentFilter = 'all';
let filteredCards = [];
let currentIndex = 0;
let isFlipped = false;
let ratingMade = false;
let quizFilter = 'all';
let quizCards = [];
let quizIndex = 0;
let quizScore = 0;
let quizAnswered = false;
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
// NAV
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
function showScreen(name) {
document.querySelectorAll('.screen').forEach(s => s.classList.remove('active'));
document.getElementById('screen-' + name).classList.add('active');
document.querySelectorAll('.tab').forEach((t, i) => {
const names = ['flashcard','quiz','map','recap'];
t.classList.toggle('active', names[i] === name);
});
if (name === 'map') renderMap();
if (name === 'recap') renderRecap();
if (name === 'quiz') initQuiz();
}
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
// FILTER
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
function getFiltered(filter) {
if (filter === 'all') return [...CARDS];
if (filter === 'weak') return CARDS.filter(c => cardStatus[c.id] === 0 || cardStatus[c.id] === undefined);
return CARDS.filter(c => c.ch === filter);
}
function setFilter(ch, btn) {
currentFilter = ch;
document.querySelectorAll('#screen-flashcard .filter-btn').forEach(b => b.classList.remove('active'));
btn.classList.add('active');
filteredCards = getFiltered(ch);
currentIndex = 0;
isFlipped = false;
ratingMade = false;
renderCard();
}
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
// FLASHCARD
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
function renderCard() {
if (!filteredCards.length) return;
const c = filteredCards[currentIndex];
const wrap = document.getElementById('card-wrap');
wrap.classList.remove('flipped');
isFlipped = false;
ratingMade = false;
document.getElementById('card-controls').style.display = 'none';
// Chapter color
const colors = {3:'var(--ch3)', 4:'var(--ch4)', 5:'var(--ch5)', synth:'var(--synth)'};
const col = colors[c.ch] || 'var(--muted)';
document.getElementById('card-num').textContent = '#' + c.id;
document.getElementById('card-num2').textContent = '#' + c.id;
document.getElementById('card-chap').innerHTML = `<span style="color:${col}">${c.section}</span>`;
document.getElementById('card-chap2').innerHTML = `<span style="color:${col}">${c.section}</span>`;
document.getElementById('card-q').textContent = c.q;
document.getElementById('card-hint').textContent = c.hint ? '๐Ÿ’ก ' + c.hint : '';
document.getElementById('card-a').innerHTML = c.a;
// Progress
const pct = ((currentIndex + 1) / filteredCards.length * 100).toFixed(0);
document.getElementById('fc-progress').style.width = pct + '%';
document.getElementById('fc-counter').textContent = (currentIndex + 1) + ' / ' + filteredCards.length;
updateStats();
}
function flipCard() {
const wrap = document.getElementById('card-wrap');
isFlipped = !isFlipped;
wrap.classList.toggle('flipped', isFlipped);
if (isFlipped && !ratingMade) {
document.getElementById('card-controls').style.display = 'grid';
}
}
function rateCard(score) {
const c = filteredCards[currentIndex];
cardStatus[c.id] = score;
ratingMade = true;
document.getElementById('card-controls').style.display = 'none';
updateStats();
setTimeout(() => nextCard(), 400);
}
function nextCard() {
if (currentIndex < filteredCards.length - 1) {
currentIndex++;
} else {
currentIndex = 0;
}
renderCard();
}
function prevCard() {
if (currentIndex > 0) currentIndex--;
else currentIndex = filteredCards.length - 1;
renderCard();
}
function shuffleCards() {
for (let i = filteredCards.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[filteredCards[i], filteredCards[j]] = [filteredCards[j], filteredCards[i]];
}
currentIndex = 0;
renderCard();
}
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
// STATS
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
function updateStats() {
let good = 0, ok = 0, bad = 0;
CARDS.forEach(c => {
if (cardStatus[c.id] === 2) good++;
else if (cardStatus[c.id] === 1) ok++;
else if (cardStatus[c.id] === 0) bad++;
});
document.getElementById('stat-maรฎtrisรฉ').textContent = good;
document.getElementById('stat-appris').textContent = ok;
document.getElementById('stat-revoir').textContent = bad;
}
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
// QUIZ
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
const WRONG_POOL = [
"Cristallisation fractionnรฉe","Plan de Wadati-Benioff","Dรฉcompression adiabatique",
"Fusion partielle","Serpentinisation","Dorsale mรฉdio-atlantique","Glaucophane",
"Faille inverse","Faille normale","Basalte en coussin","Jadรฉite","Grenat",
"Hornblende","Chlorite","Actinote","Gabbro","Andรฉsite","Diorite","Rhyolite",
"Schiste bleu","Schiste vert","ร‰clogite","Slab pull","Coin mantellique",
"Chambre magmatique","Isotherme 1300ยฐC","Pyroxรจne","Plagioclase","Serpentine",
"Nappe de charriage","Racine crustale","Moho ร  70 km","Solidus","Gรฉotherme",
"Arc insulaire","Cordillรจre","Nuรฉe ardente","5 ร  7 km","10 ร  16 cm/an",
"1 ร  5 cm/an","700 km de profondeur","50 km de profondeur","500-700ยฐC",
"Fumeurs noirs","Micaschiste","Gneiss","Pรฉridotite","Asthรฉnosphรจre"
];
function buildQuizQuestion(card) {
// Extract a short answer from the card answer (first strong)
const div = document.createElement('div');
div.innerHTML = card.a;
const strongs = div.querySelectorAll('strong');
let correctAnswer = strongs.length ? strongs[0].textContent : div.textContent.split('.')[0].trim();
correctAnswer = correctAnswer.substring(0, 80);
// Build wrong answers from pool (different from correct)
const wrongs = WRONG_POOL.filter(w => !correctAnswer.toLowerCase().includes(w.toLowerCase()));
const shuffled = wrongs.sort(() => Math.random() - 0.5).slice(0, 3);
const opts = [...shuffled, correctAnswer].sort(() => Math.random() - 0.5);
return { question: card.q, correct: correctAnswer, options: opts, explanation: card.a, section: card.section, ch: card.ch };
}
function setQuizFilter(ch, btn) {
quizFilter = ch;
document.querySelectorAll('#screen-quiz .filter-btn').forEach(b => b.classList.remove('active'));
btn.classList.add('active');
initQuiz();
}
function initQuiz() {
const pool = getFiltered(quizFilter);
quizCards = pool.sort(() => Math.random() - 0.5);
quizIndex = 0; quizScore = 0; quizAnswered = false;
document.getElementById('quiz-result').classList.remove('show');
document.getElementById('quiz-container').style.display = '';
showQuizQuestion();
}
function showQuizQuestion() {
if (quizIndex >= quizCards.length) { showQuizResult(); return; }
const card = quizCards[quizIndex];
const qdata = buildQuizQuestion(card);
const colors = {3:'var(--ch3)', 4:'var(--ch4)', 5:'var(--ch5)', synth:'var(--synth)'};
const col = colors[card.ch] || 'var(--muted)';
document.getElementById('quiz-chapter-tag').innerHTML = `<span style="color:${col}">${qdata.section}</span>`;
document.getElementById('quiz-progress-tag').textContent = `${quizIndex + 1} / ${quizCards.length}`;
document.getElementById('quiz-q-text').textContent = qdata.question;
const opts = document.getElementById('quiz-options');
opts.innerHTML = '';
qdata.options.forEach(opt => {
const btn = document.createElement('button');
btn.className = 'quiz-opt';
btn.textContent = opt;
btn.onclick = () => answerQuiz(opt, qdata.correct, qdata.explanation, btn);
opts.appendChild(btn);
});
const fb = document.getElementById('quiz-feedback');
fb.className = 'quiz-feedback';
fb.innerHTML = '';
document.getElementById('quiz-next').classList.remove('show');
quizAnswered = false;
}
function answerQuiz(chosen, correct, explanation, btn) {
if (quizAnswered) return;
quizAnswered = true;
const isCorrect = chosen === correct;
if (isCorrect) { quizScore++; btn.classList.add('correct'); }
else { btn.classList.add('wrong'); }
document.querySelectorAll('.quiz-opt').forEach(b => {
b.disabled = true;
if (b.textContent === correct) b.classList.add('correct');
});
const fb = document.getElementById('quiz-feedback');
if (isCorrect) {
fb.className = 'quiz-feedback correct-fb show';
fb.innerHTML = `โœ“ Bonne rรฉponse ! <br><small>${explanation}</small>`;
} else {
fb.className = 'quiz-feedback wrong-fb show';
fb.innerHTML = `โœ— La bonne rรฉponse รฉtait : <strong>${correct}</strong><br><small>${explanation}</small>`;
}
document.getElementById('quiz-next').classList.add('show');
}
function nextQuiz() {
quizIndex++;
showQuizQuestion();
}
function showQuizResult() {
document.getElementById('quiz-container').style.display = 'none';
const result = document.getElementById('quiz-result');
result.classList.add('show');
const pct = Math.round(quizScore / quizCards.length * 100);
const colors = pct >= 80 ? 'var(--accent3)' : pct >= 50 ? 'var(--gold)' : 'var(--accent)';
document.getElementById('result-score').style.color = colors;
document.getElementById('result-score').textContent = pct + '%';
let msg = pct >= 80 ? '๐Ÿ† Excellent ! Tu maรฎtrises ce chapitre.' :
pct >= 60 ? '๐Ÿ‘ Bien ! Quelques rรฉvisions restent utiles.' :
pct >= 40 ? 'โš  Des lacunes ร  combler โ€” retourne aux flashcards !' :
'๐Ÿ“š Reprends les flashcards et rรฉvise les notions clรฉs.';
document.getElementById('result-msg').textContent = msg;
document.getElementById('stat-quiz-score').textContent = pct + '%';
}
function restartQuiz() { initQuiz(); }
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
// REVIEW MAP
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
function renderMap() {
const grid = document.getElementById('review-grid');
grid.innerHTML = '';
CARDS.forEach(c => {
const div = document.createElement('div');
div.className = 'review-cell';
const s = cardStatus[c.id];
if (s === 2) div.classList.add('status-good');
else if (s === 1) div.classList.add('status-ok');
else if (s === 0) div.classList.add('status-bad');
else div.classList.add('status-unseen');
div.textContent = c.id;
div.title = c.q;
div.onclick = () => {
const idx = CARDS.findIndex(x => x.id === c.id);
setFilter('all', document.querySelector('#screen-flashcard .filter-btn[data-ch="all"]'));
currentIndex = idx;
renderCard();
showScreen('flashcard');
};
grid.appendChild(div);
});
}
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
// RECAP
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
function renderRecap() {
const groups = {
'3': { label: 'CHAPITRE 3 โ€” Mobilitรฉ horizontale des plaques', cls: 'recap-ch3', color: 'var(--ch3)' },
'4': { label: 'CHAPITRE 4 โ€” Dynamique des zones de divergence', cls: 'recap-ch4', color: 'var(--ch4)' },
'5': { label: 'CHAPITRE 5 โ€” Dynamique des zones de convergence', cls: 'recap-ch5', color: 'var(--ch5)' },
'synth': { label: 'SYNTHรˆSE โ€” Cycle de la lithosphรจre ocรฉanique', cls: 'recap-synth', color: 'var(--synth)' },
};
let html = '';
Object.entries(groups).forEach(([ch, g]) => {
const cards = CARDS.filter(c => c.ch === ch);
html += `<div class="recap-section">
<div class="recap-title" style="color:${g.color}">${g.label} (${cards.length} notions)</div>`;
cards.forEach(c => {
html += `<div class="recap-item ${g.cls}">
<span class="num">Notion #${c.id} โ€” ${c.section}</span>
<strong>${c.q}</strong><br>
<span style="color:var(--muted);font-size:0.73rem">${c.a.replace(/<[^>]*>/g, '')}</span>
</div>`;
});
html += `</div>`;
});
document.getElementById('recap-content').innerHTML = html;
}
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
// INIT
// โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
filteredCards = [...CARDS];
renderCard();
updateStats();
</script>
</body>
</html>