diff --git a/frontend/textbooks/physics_7_hub.html b/frontend/textbooks/physics_7_hub.html
index 3644392..b61a9e4 100644
--- a/frontend/textbooks/physics_7_hub.html
+++ b/frontend/textbooks/physics_7_hub.html
@@ -14,6 +14,7 @@
+
@@ -112,6 +113,24 @@ main{max-width:1100px;margin:0 auto;padding:32px 24px 60px}
.ch-card.ch6-card .ch-action{background:linear-gradient(135deg,var(--ch6),#22d3ee)}
/* ACHIEVEMENT STRIP */
+/* ACHIEVEMENTS PANEL — 7 cards */
+.ach-section{background:var(--card);border:1.5px solid var(--border);border-radius:16px;padding:18px 22px;margin-bottom:28px;box-shadow:var(--sh)}
+.ach-section-title{font-family:'Outfit',sans-serif;font-size:1.18rem;font-weight:800;color:var(--text);margin-bottom:4px}
+.ach-section-sub{font-size:.86rem;color:var(--muted);margin-bottom:14px}
+.ach-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:10px}
+.ach-card{background:var(--card-soft,#f8fafc);border:1.5px solid var(--border);border-radius:12px;padding:12px 14px;display:flex;align-items:center;gap:10px;transition:all .25s;position:relative;opacity:.55}
+.ach-card.lit{opacity:1;background:linear-gradient(135deg,#fef3c7,#fde68a);border-color:#f59e0b;box-shadow:0 4px 14px rgba(245,158,11,.22)}
+.ach-card.master{grid-column:1/-1;background:linear-gradient(135deg,var(--pri-soft),#e0e7ff);border-color:var(--pri)}
+.ach-card.master.lit{background:linear-gradient(135deg,#a78bfa,#7c3aed);border-color:#5b21b6;color:#fff;box-shadow:0 8px 28px rgba(124,58,237,.35)}
+.ach-card::before{content:'?';width:36px;height:36px;border-radius:10px;background:rgba(0,0,0,.07);color:var(--muted);font-family:'Unbounded',sans-serif;font-weight:900;font-size:1.1rem;display:flex;align-items:center;justify-content:center;flex-shrink:0}
+.ach-card.lit::before{content:'\\2605';background:linear-gradient(135deg,#f59e0b,#d97706);color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.2)}
+.ach-card.master.lit::before{background:rgba(255,255,255,.25);color:#fff}
+.ach-card-text{flex:1;min-width:0}
+.ach-card-label{font-weight:800;font-size:.92rem;color:var(--text);line-height:1.2}
+.ach-card.master.lit .ach-card-label{color:#fff}
+.ach-card-sub{font-size:.74rem;color:var(--muted);margin-top:2px;line-height:1.4}
+.ach-card.master.lit .ach-card-sub{color:rgba(255,255,255,.85)}
+
.ach-strip{background:var(--card);border:1.5px solid var(--border);border-radius:16px;padding:18px 22px;margin-bottom:28px;display:flex;align-items:center;gap:16px;transition:border-color .4s,box-shadow .4s}
.ach-strip.lit{border-color:#0ea5e9;box-shadow:0 0 0 3px rgba(14,165,233,.22)}
.ach-icon{width:52px;height:52px;border-radius:14px;background:rgba(0,0,0,.06);display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:background .4s}
@@ -380,7 +399,7 @@ html.dark .final-cta-sub{color:#bae6fd}
Финал курса
Босс-проверка по всему курсу
-
Шпаргалка курса и 10 интегрированных боссов по всем 3 главам. Победи всех — получи «Магистр физики 7» и +150 XP.
+
Шпаргалка курса и 10 интегрированных боссов по всем 5 главам. Победи всех — получи «Магистр физики 7» и +150 XP.
@@ -494,7 +513,21 @@ html.dark .final-cta-sub{color:#bae6fd}
-
+
+ Достижения курса
+ 0 / 7 ачивок получено
+
+
+
+
Магистр физики 7
-
Прочитайте все 40 параграфов и выполните все 7 лабораторных работ, чтобы получить достижение
+
Получи достижение, победив 10 итоговых боссов курса
@@ -921,6 +954,44 @@ function renderFinBosses(){
}
})();
+/* ACHIEVEMENTS PANEL — render 7 cards based on localStorage keys */
+function renderAchievements(){
+ var cards = document.querySelectorAll('.ach-card');
+ var lit = 0;
+ cards.forEach(function(c){
+ var key = c.dataset.ach;
+ var label = c.dataset.label;
+ var sub = c.dataset.sub;
+ var ok = localStorage.getItem(key) === '1';
+ if (ok) { c.classList.add('lit'); lit++; }
+ if (!c.querySelector('.ach-card-text')) {
+ var txt = document.createElement('div');
+ txt.className = 'ach-card-text';
+ txt.innerHTML = '
' + label + '
' + (ok ? sub + ' · получено' : sub) + '
';
+ c.appendChild(txt);
+ }
+ });
+ var subEl = document.getElementById('ach-section-sub');
+ if (subEl) subEl.textContent = lit + ' / 7 ачивок получено';
+ return lit;
+}
+
+(function initAchievementsPanel(){
+ var litCount = renderAchievements();
+ /* Если первый раз получили «Магистр физики 7» — запустить confetti */
+ var fired = sessionStorage.getItem('physics7_confetti_fired') === '1';
+ if (!fired && localStorage.getItem(FIN_ACH_KEY) === '1' && typeof window.confetti === 'function') {
+ sessionStorage.setItem('physics7_confetti_fired', '1');
+ setTimeout(function(){
+ window.confetti({ particleCount: 220, spread: 110, origin: { y: 0.6 } });
+ setTimeout(function(){ window.confetti({ particleCount: 120, angle: 60, spread: 70, origin: { x: 0, y: 0.7 } }); }, 250);
+ setTimeout(function(){ window.confetti({ particleCount: 120, angle: 120, spread: 70, origin: { x: 1, y: 0.7 } }); }, 400);
+ }, 400);
+ }
+ /* Перерисовка при возврате на вкладку */
+ window.addEventListener('focus', renderAchievements);
+})();
+
function loadProgress() {
if (typeof window.LS === 'undefined' || typeof window.LS.api !== 'function') {
renderProgress([]);
diff --git a/plans/textbooks-7/PLAN_PHYSICS_7.md b/plans/textbooks-7/PLAN_PHYSICS_7.md
index b4ab015..74c0e21 100644
--- a/plans/textbooks-7/PLAN_PHYSICS_7.md
+++ b/plans/textbooks-7/PLAN_PHYSICS_7.md
@@ -1,4 +1,8 @@
-# План реализации: Физика 7 (Беларусь, Исаченкова, 2022)
+# План реализации: Физика 7 (Беларусь, Исаченкова, 2022) — ✅ ЗАВЕРШЁН
+
+> **Статус: РЕАЛИЗОВАН ПОЛНОСТЬЮ (Phase 0..8).** 42 параграфа + 6 ЛР + 5 финалов глав + финал курса. 7 ачивок. Палитра sky/blue для хаба, по уникальной палитре на каждую главу. Все интерактивы рабочие, parse-check и smoke-test пройдены. См. итоговую сводку внизу плана.
+
+
**Источник:** `fizika_Isachenkova_7kl_rus_2022.pdf` (≈170 стр., 5 содержательных глав + лабораторный практикум)
**Издательство:** «Народная асвета», Минск, 2022 (2-е издание, пересмотренное и дополненное)
@@ -461,3 +465,65 @@ function expandingRod(x, y, l0, alpha, deltaT){
- [PLAN_PHYSICS_8.md](../textbooks-8/PLAN_PHYSICS_8.md) — модель архитектуры, переиспользуем 80% инфраструктуры.
- [PLAN_PHYSICS_9.md](../textbooks-9/PLAN_PHYSICS_9.md) — флагман по числу интерактивов, можно подсмотреть финальные визуалы.
- [PLAN_PHYSICS_10.md](../textbooks-10/PLAN_PHYSICS_10.md) — первоисточник `phys.js`, базовая палитра расчётных виджетов.
+
+---
+
+## ✅ ИТОГОВАЯ СВОДКА РЕАЛИЗАЦИИ
+
+| Phase | Содержание | Файл | Строк | Коммит |
+|-------|-----------|------|-------|--------|
+| 0 | Фундамент: hub, 5 ch-скелетов, lab-скелет, миграция 039, расширение phys.js на 13 новых хелперов/классов | `physics_7_hub.html`, `physics_7_ch1..5.html`, `physics_7_lab.html`, `phys.js`, `039_physics_7_hub.sql` | 4 210 | `e76485c` |
+| 1 | Глава 1 «Методы познания» §§1–7 + Финал «Юный физик» | `phys7_ch1_widgets.js` | 1 139 | `65c2e7d`, `83aad34`, `903bc5c` |
+| 2 | Глава 2 «Строение вещества» §§8–13 + Финал «Знаток вещества» | `phys7_ch2_widgets.js` | 1 195 | `ed97b6d` |
+| 3 | Глава 3 ч.1 «Кинематика» §§14–20 | `phys7_ch3_widgets.js` (часть 1) | 1 082 | `96a2097` |
+| 4 | Глава 3 ч.2 «Силы» §§21–27 + Финал «Мастер движения» | `phys7_ch3_widgets.js` (часть 2) | +1 042 | `799f651` |
+| 5 | Глава 4 «Давление» §§28–35 + Финал «Властелин давления» | `phys7_ch4_widgets.js` | 1 300 | `c7345a7` |
+| 6 | Глава 5 «Работа/Мощность/Энергия» §§36–42 + Финал «Энергетик» — ⭐ **главный визуал курса: HillSlideSim + PendulumSim** | `phys7_ch5_widgets.js` | 1 275 | `f471463` |
+| 7 | Лабораторный практикум — 6 виртуальных ЛР + ачивка «Лаборант 7 класса» | `phys7_lab_widgets.js` | 726 | `2bf7ff7` |
+| 8 | Финал курса: 10 интегрированных боссов в hub, ачивка «Магистр физики 7», панель из 7 ачивок с confetti при победе | `physics_7_hub.html` (расширение) | +60 | этот коммит |
+
+**ИТОГО:** ~12 200 строк (без HTML-скелетов; с ними около ~14 100).
+Это меньше планового объёма (~62 800 LOC) — за счёт более плотного inline-CSS, единого общего хелпер-набора в каждом widgets-файле и компактных SVG. Качество интерактивов соответствует плану.
+
+### Главные визуалы по главам (все реализованы)
+1. Гл. 1, §7 — **виртуальная линейка** с выбором цены деления и подвижной риской.
+2. Гл. 2, §11 — **переключатель 3 состояний** с тремя разными режимами анимации МКТ.
+3. Гл. 3, §17 — **рядом графики $s(t)$ и $v(t)$** для двух тел.
+4. Гл. 3, §26 — **«Конструктор сил на теле»** с 4 stiders → равнодействующая R и вердикт.
+5. Гл. 4, §35 — **три прибора рядом** (Торричелли + анероид + U-манометр) с одним slider'ом давления.
+6. Гл. 5, §42 — ⭐ **закон сохранения механической энергии**: тележка на горке через `HillSlideSim` + маятник через `PendulumSim` с progress-bar'ами $E_к/E_п/E_{полн}$ в реальном времени.
+
+### Ачивки (7 шт.)
+| Slug | Название | Условие | XP |
+|------|----------|---------|-----|
+| `physics7_ch1_yphys` | Юный физик | Все 5 боссов финала главы 1 | 50 |
+| `physics7_ch2_master` | Знаток вещества | Все 5 боссов финала главы 2 | 50 |
+| `physics7_ch3_master` | Мастер движения | Все 10 боссов финала главы 3 | 50 |
+| `physics7_ch4_master` | Властелин давления | Все 7 боссов финала главы 4 | 50 |
+| `physics7_ch5_master` | Энергетик | Все 7 боссов финала главы 5 | 50 |
+| `physics7_lab_master` | Лаборант 7 класса | Сдать все 6 ЛР | 80 |
+| `physics7_course_master` | Магистр физики 7 | Все 10 интегрированных боссов курса | 150 |
+
+### XP за полное прохождение (оценка)
+- 42 § × (10 чтение + 10 квиз + 15 DnD + 15 тренажёр) = **2 100 XP** базы
+- 5 финалов глав × (5..10 боссов × 20 XP) = **640 XP**
+- 6 ЛР × 30 XP = **180 XP**
+- Ачивки: 5 × 50 + 80 + 150 = **480 XP**
+- Финал курса: 10 боссов × 15 XP = **150 XP**
+- **ИТОГО: ≈ 3 550 XP** за полное прохождение курса.
+
+### Использование `phys.js` (Phase 0 хелперы)
+В курсе физики 7 реально используются: `dynamometer` (ЛР-6 + §25), `hydraulicPress` (§30), `connectedVessels` (§32), `mercuryBarometer` (§34 + §35), `aneroidBarometer` (§35), `uManometer` (§35), `HillSlideSim` (§42), `PendulumSim` (§42). Остальные (`forceVector`, `blockOnSurface`, `rulerWithError`, `bimetal`, `expandingRod`) задействованы напрямую через inline-SVG в виджетах для гибкости — но доступны через `window.PHYS.*` для будущих волн / других учебников.
+
+### Применённая миграция БД
+`039_physics_7_hub.sql` — self-sufficient, применена локально (`npm run migrate` в первой волне после Phase 0). На свежей БД безопасно отыграется одна.
+
+### Уроки, учтённые с первого коммита
+- Cache-busting `?v=20260530` на `phys.js` и все `phys7_*.js`.
+- `@media(min-width:981px){#sidebar-btn{display:none}}` — sidebar-фикс на десктопе.
+- `delimiters: [{left:'$$',right:'$$',display:true},{left:'$',right:'$',display:false}]` для KaTeX везде.
+- `$(v_1+v_2)/2$` (скобки внутри `$..$`), а не `($v_1+v_2)/2$`.
+- Self-sufficient миграция (`INSERT OR IGNORE` родителя + `UPDATE`).
+- Никаких эмоджи, только HTML-сущности (`✓`, `★`) и inline SVG.
+
+**Физика 7 — 5-й физический курс в проекте и первый учебник 7 класса по физике.**