feat(cefr): CEFR level testing and automated gap ingestion engine (Task 15)

This commit is contained in:
Antigravity committed 2026-10-06 15:24:33 +03:00
1 parent 1c3f03a64c
commit 3fae321322
11 files changed
+2926 -10

No files matched your search

+85 -1
View File
@@ -70,6 +70,9 @@
<button id="nav-reader-btn" class="btn btn-outline btn-sm" title="Интерактивная читалка и библиотека книг">
<span>📚 Читалка</span>
</button>
<button id="nav-cefr-btn" class="btn btn-outline btn-sm" title="Уровневые тесты CEFR (A1, A2, B1, B2)">
<span>🎯 Тесты CEFR</span>
</button>
<button id="srs-trainer-btn" class="btn btn-trainer" title="Интервальный тренажер (Flashcards, 4 варианта, диктант, ввод)">
<span class="trainer-icon">🎓</span>
<span class="trainer-text">Тренажёр SRS</span>
@@ -250,6 +253,9 @@
</div>
<div class="srs-topbar-right">
<button id="srs-jump-cefr-btn" class="btn btn-sm btn-outline" title="Пройти уровневый тест CEFR (A1–B2)">
<span>🎯 Тесты CEFR</span>
</button>
<button id="srs-mix-btn" class="btn btn-sm btn-ghost" title="Умный микс дня: 10 новых + 10 повторов + 5 трудных слов">
<span id="srs-mix-label">🎲 Микс дня: ВКЛ</span>
</button>
@@ -589,6 +595,83 @@
</div>
</div>
</section>
<!-- VIEW 4: CEFR Level Tests View -->
<section id="cefr-view" class="cefr-view hidden">
<!-- Screen 1: Level Overview & Selection -->
<div id="cefr-overview-screen" class="cefr-overview-container">
<div class="cefr-header">
<div class="cefr-title-wrap">
<h2>🎯 Уровневые тесты CEFR (A1 – B2)</h2>
<p class="subtitle">Эталонные тесты по международной шкале Oxford 3000/5000. Ошибки автоматически добавляются в ваш личный тренажёр SRS со статусом «В процессе»!</p>
</div>
</div>
<div id="cefr-levels-grid" class="cefr-levels-grid">
<!-- Dynamic level cards rendered by cefr.js -->
</div>
</div>
<!-- Screen 2: Active Cloze Tap Quiz -->
<div id="cefr-quiz-screen" class="cefr-quiz-container hidden">
<header class="cefr-quiz-topbar">
<div class="cefr-quiz-topbar-left">
<button id="cefr-back-btn" class="btn btn-sm btn-outline">← К уровням</button>
<span id="cefr-quiz-level-badge" class="level-pill">Уровень A1</span>
</div>
<div class="cefr-quiz-topbar-center">
<div class="srs-progress-container">
<div id="cefr-quiz-progress-bar" class="srs-progress-fill" style="width: 0%;"></div>
</div>
<span id="cefr-quiz-counter" class="srs-counter">1 / 10</span>
</div>
</header>
<div class="cefr-quiz-card-wrapper">
<div id="cefr-cloze-card" class="cefr-cloze-card">
<!-- Dynamic question content rendered by cefr.js -->
</div>
<div id="cefr-next-bar" class="cefr-next-bar hidden">
<button id="cefr-next-btn" class="btn btn-primary btn-lg btn-block">Следующий вопрос → (Space)</button>
</div>
</div>
</div>
<!-- Screen 3: Quiz Session Summary -->
<div id="cefr-summary-screen" class="cefr-summary-container hidden">
<div class="cefr-summary-card">
<div class="summary-trophy">🏆</div>
<h2>Тест завершён!</h2>
<p id="cefr-sum-lead" class="summary-lead">Отличная работа по проверке словарного запаса.</p>
<div class="summary-metrics">
<div class="metric-card">
<span class="metric-val text-primary" id="cefr-sum-score">0%</span>
<span class="metric-desc">Точность</span>
</div>
<div class="metric-card">
<span class="metric-val text-success" id="cefr-sum-correct">0 / 0</span>
<span class="metric-desc">Правильно</span>
</div>
<div class="metric-card">
<span class="metric-val text-warning" id="cefr-sum-mistakes">0</span>
<span class="metric-desc">Ошибок</span>
</div>
<div class="metric-card">
<span class="metric-val text-danger" id="cefr-sum-ingested">0</span>
<span class="metric-desc">Добавлено в SRS</span>
</div>
</div>
<div class="summary-buttons">
<button id="cefr-sum-repeat-btn" class="btn btn-primary btn-lg">🔄 Ещё 10 вопросов</button>
<button id="cefr-sum-srs-btn" class="btn btn-outline btn-lg hidden">🎓 Закрепить ошибки в SRS</button>
<button id="cefr-sum-levels-btn" class="btn btn-ghost btn-lg">← К списку уровней</button>
</div>
</div>
</div>
</section>
<!-- Sticky Bulk Action Bar for Batch Selection Mode -->
<div id="batch-action-bar" class="batch-action-bar hidden">
@@ -648,6 +731,7 @@
</div>
</div>
<div class="mobile-menu-actions">
<button id="mobile-cefr-btn" class="btn btn-outline btn-block">🎯 Уровневые тесты CEFR (A1–B2)</button>
<button id="mobile-stats-btn" class="btn btn-outline btn-block">📊 Статистика & Календарь</button>
<button id="mobile-export-btn" class="btn btn-outline btn-block">📤 Экспорт словаря</button>
<button id="mobile-pwd-btn" class="btn btn-outline btn-block">🔑 Сменить пароль</button>
@@ -1114,7 +1198,7 @@
<!-- Audio Element for native streaming -->
<audio id="global-audio-player" preload="none"></audio>
<script type="module" src="/static/js/app.js?v=5.0"></script>
<script type="module" src="/static/js/app.js?v=5.1"></script>
</body>
</html>