Commit Graph

405 Commits

Author SHA1 Message Date
Maxim Dolgolyov b005226e2c feat(gamification): Phase 3 — 38 new achievements + triggers + 'exam' group
Adds achievement coverage for every feature shipped since the original
seed: exam-prep (math9), textbooks, classroom/board, biochemistry,
live-quiz, flashcards, hangman/crossword, pet, plus a new 'social' group
for class & leaderboard wins and 'consistency' extensions (streak_100,
goal_30, early_bird, night_owl).

74 achievements now (was 36), grouped into 7 sections:
  onboarding (3) → volume (8) → mastery (16) → consistency (7) →
  exam (9) → exploration (21) → social (10)

A new top-level group 'exam' slots between consistency and exploration
in the profile UI.

What's wired in service.checkPhase3Achievements (called from
checkAchievements):
  • streak_100 — extends the existing streak track
  • goal_30 — 30 days with daily_goals fully met (SUM check)
  • early_bird / night_owl — strftime('%H', xp_log.created_at)
  • exam_first / 25 / 100 — exam_attempts where is_correct=1
  • exam_variant_clear / 5_variants — perfect mock-variant sessions
  • exam_topic_master — ≥10 attempts at ≥90% on a single subtopic
  • exam_mock_done / pass / perfect — exam_mock_sessions.score
  • tb_first_para — textbook_progress
  • fc_first_deck / 100_cards / 1000_cards — flashcard_reviews
  • bc_first_molecule / 5_challenges / 20_challenges — bio_user_*
  • game_win_5 / 25 — xp_log reason IN (hangman_win, crossword_win)
  • pet_streak_7 / 30 — users.pet_petting_streak
  • lq_first / 3_quizzes — live_answers grouped by session
  • cr_first_join / 5 / 25_lessons — classroom_attendance
  • class_5_members / 25 — teacher's biggest class
  • parent_link — parent_links presence
  • lb_top10 / lb_top1 — weekly XP rank among students

What's deferred (catalog entry only, no trigger yet):
  • tb_chapter_done / tb_book_done / tb_3_books — need to parse
    textbook_progress.paragraphs_read JSON against textbook structure

Every block is wrapped in its own try/catch so a missing table on a
legacy install can't take down the whole achievement sweep.

Verified end-to-end: admin user picked up 7 new unlocks on first
checkAchievements call after seed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-29 20:26:59 +03:00
Maxim Dolgolyov 90c8464356 feat(gamification): Phase 2 — taxonomy + grouped UI for achievements
Achievements gain four new columns: group_slug, track, tier, sort_order.
Existing 36 are backfilled into 5 groups (onboarding/volume/mastery/
consistency/exploration) by migration 030; 'social' stays empty until
Phase 3 adds class/leaderboard/live-quiz tracks.

Tracks bundle escalating thresholds into one progression (tests_10/50/
100 → track='tests', tiers 1-3), so the UI can show '★★★' on the top
tier and the user understands the relationship. sort_order is reserved
in blocks of 10 inside groups of 100, leaving room for inserts without
renumbering.

Backend:
  • migration 030 adds the columns + index + backfill UPDATEs
  • _shared.ACHIEVEMENT_DEFS gains group/track/tier/sort_order per row
  • _shared exports new ACHIEVEMENT_GROUPS metadata for the UI
  • service.seedAchievements writes the new fields on insert AND
    backfills them via UPDATE on existing rows (fresh installs +
    pre-migration installs both end up consistent)
  • _shared.stmts.getAllAchs SELECT updated, ORDER BY sort_order
  • gamification/api.getAchievements forwards the new fields

Frontend:
  • profile.html groups achievements by group_slug with a per-section
    header (icon + title + 'unlocked / total' chip) and a tier-star
    badge (★★ etc.) on tier ≥ 2 items
  • Hard-coded ACH_GROUPS mirror of the backend list (small, stable)
  • New CSS for .ach-group / .ach-group-head / .ach-tier

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-29 20:19:46 +03:00
Maxim Dolgolyov 660e7e2747 feat(gamification): Phase 1 — full kill-switch + textbook XP wrapping
Until now the 'gamification' feature flag did nothing: it had no row in
app_settings, the admin couldn't toggle it, awardXP/awardCoins ignored
it, and the CSS only hid three dashboard widgets — XP bars in textbooks
stayed visible regardless.

Phase 1 closes every hole.

Backend (source of truth):
  • migration 029 seeds feature_gamification_enabled=1
  • new isGamificationEnabled() helper in gamification/_shared.js with a
    30s cache + invalidateGamificationCache() for instant admin toggles
  • awardXP / awardCoins / updateStreak / unlockAchievement /
    checkAchievements all bail out when the flag is off
  • /api/gamification/* and /api/shop/* (user routes) return 404 when
    disabled; admin routes remain open so the switch itself is reachable
  • adminController.updateFeatures gains 'gamification' in the allow-list
    and invalidates the cache on flip

Frontend:
  • LS.isGamificationEnabled() (synchronous, populated by loadFeatures)
    so xp.js + applyCosmetics can bail without a round-trip
  • xp.js load/add/flush become no-ops when the flag is off
  • applyCosmetics skips the round-trip when off
  • CSS .no-gamification rule expanded to cover .hero-xp-badge, .po-xp,
    .xp-card, .xp-bar, #frames-section, and a universal [data-gamified]
    hook for future blocks

Textbooks (Variant 2 of the plan):
  • backend/scripts/wrap_textbook_xp.py — idempotent script that adds
    data-gamified to 167 XP tags across 63 textbook files (chapters +
    hubs, all subjects/grades). Single CSS rule now hides everything.

Verified end-to-end: with the flag off, awardXP/awardCoins write nothing;
flipping back restores normal behavior.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-29 19:43:24 +03:00
Maxim Dolgolyov 3e7e6e5b9b feat(phys11 ch8): Waves 13-14 — Глава 8 + ФИНАЛ КУРСА (12 интегральных боссов)
- ch8 — индиго-тема (--pri:#4f46e5), watermark ∞/★
- §45: эволюция картины мира (механика → ЭМ → СТО → ОТО → кванты → Стандартная модель), иерархия материи (от кварков до Вселенной), открытые проблемы (тёмная материя, тёмная энергия, объединение теорий)
- ФИНАЛ КУРСА: 12 интегральных боссов по всем 8 главам
  - Босс I: Колебания (Гл. 1)
  - Босс II: ЭМ-индукция (Гл. 2)
  - Боссы III-IV: Оптика (Гл. 3, §14-§17 и §18-§23)
  - Босс V: СТО (Гл. 4)
  - Босс VI: Фотоны (Гл. 5)
  - Боссы VII-VIII: Атом + Лазеры (Гл. 6)
  - Боссы IX-XI: Ядерная физика (Гл. 7)
  - Босс XII: Элем. частицы + картина мира
- Каждый босс 5 этапов, +80 XP
- При победе всех 12: ачивка phys11_master 'МАГИСТР ФИЗИКИ 11' + 500 XP бонус
- КУРС ФИЗИКИ 11 КЛАССА ЗАВЕРШЁН: 8 глав, 45 параграфов, ~80 боссов, 9 финальных ачивок
2026-05-29 19:30:41 +03:00
Maxim Dolgolyov cef226c53e feat(phys11 ch7): Waves 11-12 — Глава 7 «Ядерная физика» (§35-§44 + Финал)
- phys-fx.js: PHYS.RadioactiveDecay (график N(t)=N₀·2^(-t/T))
- ch7 — розово-красная тема (--pri:#e11d48), 10 параграфов
- §35: протонно-нейтронная модель, нуклоны, изотопы, изобары, ядерные силы
- §36: ядерные реакции, законы сохранения,  = \Delta m c^2$
- §37: дефект массы, {св}$, удельная $\varepsilon$, максимум у Fe
- §38: радиоактивность (Беккерель), α/β/γ, проникающая способность
- §39: закон распада  = N_0 \cdot 2^{-t/T}$, активность (Бк), C-14
- §40: деление U-235, цепные реакции, $, критическая масса
- §41: ядерный реактор (Ферми 1942), замедлитель, стержни, ВВЭР/РБМК
- §42: термояд D+T, Солнце, ИТЭР, токамак
- §43: дозы (Грей, Зиверт), коэф. $, нормы радиационной безопасности
- §44: Стандартная модель — 6 кварков, 6 лептонов, бозоны, Хиггс (2012), 4 взаимодействия
- 20 квизов + 10 боссов + 5 интегральных финальных боссов
- Финал главы: +200 XP, ачивка ch7_master 'Магистр ядра'
2026-05-29 19:26:16 +03:00
Maxim Dolgolyov a6d86f4374 feat(phys11 ch6): Wave 10 — Глава 6 «Физика атома» (§30-§34 + Финал)
- phys-fx.js: PHYS.BohrAtom (атом водорода с орбитами + переходом + фотон), PHYS.EnergyLevels (диаграмма E_n + переход + λ)
- ch6 — зелёная тема (--pri:#16a34a), watermark ⊕/n/ν/ω/L/★
- §30: открытие электрона (Томсон), опыт Резерфорда (1911), состав ядра, изотопы
- §31: 2 постулата Бора (1913), E_n=-13,6/n², Боровский радиус
- §32: спектры (сплошные/линейчатые/полосатые), формула Ридберга, серии Лаймана/Бальмера/Пашена
- §33: спонтанное и индуцированное излучение (Эйнштейн 1916), инверсная населённость
- §34: лазеры (Мейман 1960), резонатор, 4 свойства лазерного излучения, применения
- 10 квизов + 5 боссов (b1-b5) + buildSingleQuizPara helper для компактности
- Финал: 3 интегральных босса (fb1-fb3), +150 XP бонус, ачивка ch6_master
2026-05-29 19:18:04 +03:00
Maxim Dolgolyov b5c224d7f5 feat(phys11 ch5): Wave 9 — Глава 5 «Фотоны. Действия света» (§27-§29 + Финал)
- phys-fx.js: PHYS.PhotoeffectLab (катод+свет+анод+амперметр), PHYS.PlanckLinear (график Eк,max от ν)
- ch5 — розовая тема (--pri:#ec4899), watermark hν/A/λ/★
- §27: кризис АЧТ, гипотеза Планка E=hν (1900), открытие ф/э (Герц, Столетов), 3 закона
- §28: фотон, уравнение Эйнштейна hν=A+Eк, работа выхода, красная граница
- §29: импульс фотона p=hν/c, давление света, опыт Лебедева (1900), КВ-дуализм, де Бройль λ=h/p
- 6 квизов + 3 босса (b1-b3)
- Финал: 3 интегральных босса (fb1-fb3), +150 XP бонус, ачивка ch5_master
2026-05-29 19:10:17 +03:00
Maxim Dolgolyov 9df4fd5e24 feat(phys11 ch4): Wave 8 — Глава 4 «Основы СТО» (§24-§26 + Финал)
- phys-fx.js: PHYS.GammaPlot (график γ(β)), PHYS.TimeDilation (двое часов), PHYS.LengthContraction (стержень в покое и в движении)
- ch4 — синяя тема (--pri:#2563eb), watermark c/γ/E/★
- §24: принцип отн. Галилея, кризис эфира, опыт Майкельсона – Морли
- §25: 2 постулата Эйнштейна, замедление времени Δτ=γΔτ₀, сокращение L=L₀/γ, релятив. сложение скоростей
- §26: релятив. импульс p=γmv, E=γmc², E₀=mc², E²=(pc)²+(mc²)², аннигиляция, ядерная энергия
- 6 квизов + 3 босса (b1-b3)
- Финал: 3 интегральных босса (fb1-fb3), +150 XP бонус, ачивка ch4_master
2026-05-29 18:56:52 +03:00
Maxim Dolgolyov 06db392f6a feat(phys11 ch3): Wave 7 — §21-§23 + Финал главы 3 (ThinLens + TwoLensSystem)
- phys-fx.js: PHYS.ThinLens (собирающая/рассеивающая, 2 канон. луча, формула, мнимое=пунктир), PHYS.TwoLensSystem (телескоп Кеплера + микроскоп)
- §21: тонкая линза, формула 1/d + 1/f = 1/F, оптическая сила D = 1/F (дптр), 3 характерных луча
- §22: фотоаппарат (d > 2F) и проектор (F < d < 2F) на одном интерактиве
- §23: лупа Γ = 25/F, микроскоп Γ ≈ Γ_об·25/F_ок, телескоп Кеплера Γ = F_об/F_ок
- 6 квизов (I8-I10 CALC/TH) + 3 босса (b8-b10)
- Финал главы 3: 5 интегрированных боссов (fb1-fb5), +200 XP бонус, ачивка ch3_master
- checkFinalDone() — авто-проверка победы над всеми 5 боссами
- Глава 3 полностью завершена (10 параграфов + финал)
2026-05-29 18:48:16 +03:00
Maxim Dolgolyov 7a703bd184 feat(phys10 phase7 final): итоговая шпаргалка + 10 боссов + ачивка «Магистр физики 10» (+150 XP) 2026-05-29 18:46:10 +03:00
Maxim Dolgolyov 27a67d0866 feat(phys11 ch3): Wave 6 — §18-§20 + phys-fx SphericalMirror/RefractionLab/PrismSpectrum
- phys-fx.js: PHYS.SphericalMirror (вогнутые/выпуклые с формулой и 3 лучами), PHYS.RefractionLab (закон Снелла + ПВО), PHYS.PrismSpectrum (дисперсия, 7 цветов через модель Коши)
- §18: сферические зеркала, формула 1/d + 1/f = 1/F, увеличение Γ = -f/d, построение
- §19: показатель преломления n=c/v, закон Снелла, полное внутр. отражение
- §20: призма + дисперсия, плоскопараллельная пластинка, оптоволокно
- 6 квизов (I5-I7 CALC/TH) + 3 босса (b5-b7)
- §21-§23 + Final остаются заглушками для W7
2026-05-29 18:41:51 +03:00
Maxim Dolgolyov a5ffc624cf feat(phys10 ch6 wave2 + final): §36 «Газы» + §37 «Полупроводники» + Финал Главы 6 2026-05-29 18:41:39 +03:00
Maxim Dolgolyov e4801dcc2f feat(phys11 ch3): Wave 5 — Глава 3 «Оптика» §14-§17 + phys-fx TwoSlit/DiffractionGrating/FlatMirror
- phys-fx.js: PHYS.TwoSlit (опыт Юнга), PHYS.DiffractionGrating (с радужным спектром), PHYS.FlatMirror
- ch3 §14: Электромагнитная природа света + скорость света
- ch3 §15: Интерференция (опыт Юнга)
- ch3 §16: Дифракция света + дифракционная решётка
- ch3 §17: Отражение света + плоское зеркало
- 8 квизов (I1_CALC/NAT, I2_CALC/TH, I3_CALC/TH, I4_CALC/IMG)
- 4 босса (b1-b4) для §14-§17
- §18-§23 + Final — заглушки для W6/W7
2026-05-29 18:35:08 +03:00
Maxim Dolgolyov bed085ac98 feat(phys10 ch6 wave1): §34 «Ток в металлах» + §35 «Электролиты»
§34 «Электрический ток в металлах. Сверхпроводимость»:
- 3 makeCard: природа тока, R(t) для металлов, сверхпроводимость
- IV1: симуляция дрейфа электронов в решётке (SVG, slider U)
- IV2: график R(t) = R_0(1 + alpha t), переключение материалов + скачок T_c
- IV3: квикфайр на носителей заряда в средах (6 вопросов)
- IV4: тренажёр 5 задач (rho L/S, R при разных T, T_c ртути)

§35 «Электрический ток в электролитах. Электролиз»:
- 3 makeCard: электролиты/ионы, законы Фарадея, применение
- IV1: симуляция электролиза (катионы → катоду, анионы → аноду)
- IV2: калькулятор массы m = MIt/(Fn) для Cu/Ag/Al/Fe/H
- IV3: квикфайр направления ионов (6 вопросов, 2 кнопки)
- IV4: тренажёр 5 задач (расчёт m для Cu/Ag, F = 96500)
2026-05-29 18:32:53 +03:00
Maxim Dolgolyov e192feefcc feat(phys11 W4): Глава 2 §10-§13 + Финал главы 2
§10 Производство и передача электроэнергии:
- ТЭС/ГЭС/АЭС; формула потерь P=I²R
- Идея высоковольтных ЛЭП: чтобы уменьшить потери, повышают U
- Магистральные ЛЭП до 750 кВ → 220 В у потребителя
- 5 расчётов (включая повышение U в k раз → потери /k²)
- Босс §10: 5 этапов, +70 XP

§11 Экологические проблемы:
- ВИЭ: ВЭС, СЭС, ГеоТЭС, приливные, биогаз
- Достоинства (без CO₂) и недостатки (погода, площадь)
- 6+5 квизов на типы и плюсы/минусы
- Босс §11: 5 этапов, +70 XP

§12 ЭМ волны. Шкала ЭМ волн:
- ЭМ волна как поперечная, c = 1/√(ε₀μ₀) = 3·10⁸ м/с
- Inline SVG-шкала: радио/СВЧ/ИК/видимый/УФ/рентген/γ
  с радужным градиентом для видимого света
- 5 расчётов λ↔ν + 5 MC на диапазоны
- Босс §12: 5 этапов, +70 XP

§13 Действие ЭМ на живые организмы:
- Ионизирующее (>10 эВ: УФ-С, рентген, γ) vs неионизирующее
- Полезные применения и опасности
- Защита: экранирование (свинец), расстояние, время
- Босс §13: 5 этапов, +65 XP

Финал главы 2:
- 4 интегральных босса (LC+ток, трансф+ЛЭП, ЭМ волны, сборная)
- Celebration: ачивка phys11_ch2_master + 100 XP бонус

Файл 63 → 91 КБ. JS валидируется.
2026-05-29 18:25:30 +03:00
Maxim Dolgolyov d93d8b782e feat(phys10 ch5 wave4 + final): §33 «Самоиндукция» + Финал Главы 5 (7 боссов) 2026-05-29 18:24:57 +03:00
Maxim Dolgolyov 8c3e7ce7aa feat(phys10 ch5 wave3): §31 «Магнитный поток + ЭМИ» + §32 «Ленц + Фарадей» 2026-05-29 18:18:29 +03:00
Maxim Dolgolyov a09616450f feat(phys11 W3): Глава 2 §7-§9 + расширение phys-fx.js (LCcircuit, ACgen, Transformer)
phys-fx.js (+3 электротехнических компонента):
- PHYS.LCcircuit: колебательный контур со схемой C↔L, провода, стрелка тока,
  заряды на пластинах (меняют знак), энергетические столбцы W_C и W_L,
  формула T=2π√(LC) с актуальным значением
- PHYS.ACgen: генератор переменного тока — слева вращающаяся рамка в B,
  справа график U(t)=U₀sin(ωt) с историей
- PHYS.Transformer: схема трансформатора с сердечником, обмотки N₁, N₂,
  входное U₁, расчётное U₂, коэф. трансформации k, отметка повышающий/понижающий

physics_11_ch2.html (~63 КБ, violet-тема):
- 2-кол layout с col-side, hero violet-градиент
- psel-grid 8 карточек (§7-§13 + Финал); §7-§9 активны
- Watermarks: LC, ∿, ≡, , ⚙, λ, ☣, ★

§7 Колебательный контур. Формула Томсона:
- 3 теор. карточки (контур, формула Томсона, превращения энергии)
- Инт. 1: LCcircuit с ползунками L (1-100 мГн), C (0.1-10 мкФ)
- Инт. 2: расчёт T, ν (5 input)
- Инт. 3: аналогии и свойства (5 MC)
- Босс §7: 5 этапов, +70 XP

§8 Вынужденные ЭМ колеб. Переменный ток:
- 2 теор. карточки (генератор, действ. значения I₀/√2)
- Инт. 1: ACgen (вращ. рамка → синусоида) с ползунком ω
- Инт. 2: расчёт I/I₀, U/U₀ (5 input)
- Инт. 3: теория действующих значений (5 MC)
- Босс §8: 5 этапов, +70 XP

§9 Трансформатор:
- 2 теор. карточки (устройство, коэф. трансформации, I₁U₁=I₂U₂)
- Инт. 1: Transformer с ползунками N₁ (50-1000), N₂ (10-1000), U₁ (12-10000 В)
- Инт. 2: расчёт U₂, I₂, k (5 input)
- Инт. 3: повышающий/понижающий (5 MC)
- Босс §9: 5 этапов, +70 XP

§10-§13, Финал — stub-карточки 'в разработке (W4)'.

LocalStorage: physics11_ch2_*, общий physics11_xp
Server sync: /api/textbooks/physics-11-ch2/progress
2026-05-29 18:15:00 +03:00
Maxim Dolgolyov 7aa681b503 feat(phys10 ch5 wave2): §29 «Сила Ампера» + §30 «Сила Лоренца» + 3D-траектория 2026-05-29 18:11:18 +03:00
Maxim Dolgolyov 6087c814b3 feat(phys10 ch5 wave1): §27 «Магнитное поле тока» + §28 «Индукция» 2026-05-29 18:03:50 +03:00
Maxim Dolgolyov fb01e5aafb feat(phys11 W2): Глава 1 §4-§6 + Финал + ResonanceCurve/TransverseWave/LongitudinalWave
phys-fx.js (+3 компонента):
- PHYS.ResonanceCurve: график A(ω) при разных γ затухания, маркер ω₀ и текущей ω
- PHYS.TransverseWave: бегущая поперечная волна (струна) с красным маркером колеблющейся точки + скобка λ
- PHYS.LongitudinalWave: зоны сжатия/разрежения через 60 точек-молекул

physics_11_ch1.html (63→89 КБ):

§4 Резонанс:
- 2 теор. карточки (свобод./вынужд., резонанс ω≈ω₀, формула A(ω))
- Инт. 1: ResonanceCurve с ползунками γ и ω — видно как пик уменьшается с ростом затухания
- Инт. 2: верно/неверно (5)
- Инт. 3: что произойдёт (5, качели/мост Tacoma/солдатский шаг)
- Босс §4: 5 этапов, +70 XP

§5 Волны:
- 2 теор. карточки (определение, поперечные/продольные, λ=vT)
- Инт. 1: TransverseWave с 3 ползунками (A, λ, v) — красная точка показывает что частица колеблется на месте
- Инт. 2: LongitudinalWave (звук-аналог) с 2 ползунками
- Инт. 3: расчёт λ,v,T (5 input)
- Инт. 4: тип волны и свойства (5 MC)
- Босс §5: 5 этапов, +70 XP

§6 Звук:
- 2 теор. карточки (звук как продол. упруг. волна, диапазоны, громкость/высота/тембр)
- Инт. 1: LongitudinalWave (звуковая) с ползунками A, λ
- Инт. 2: расчёт λ звука в воздухе (5 input)
- Инт. 3: свойства звука (5 MC)
- Босс §6: 5 этапов, +65 XP

Финал главы 1:
- 4 интегральных босса (колебания, маятники+энергия, резонанс, волны+звук)
- Celebration: ачивка phys11_ch1_master + 100 XP бонус
- Сохранение в localStorage.physics11_achievements
2026-05-29 18:02:53 +03:00
Maxim Dolgolyov 2b13976610 feat(phys10 ch4 + final): §25 ЭДС + §26 закон Ома + Финал Главы 4 2026-05-29 17:56:38 +03:00
Maxim Dolgolyov f2a1c6e24d feat(phys11 W1): Глава 1 §1-§3 + расширение phys-fx.js (EnergyView)
phys-fx.js (+EnergyView):
- PHYS.EnergyView — график 3 кривых: W_к (красный), W_п (зелёный), W_мех=const (фиолетовый пунктир)
- Использует кинетическую/потенциальную энергию для гарм. колеб.: cos², sin², сумма = 1
- Легенда в правом верхнем углу

physics_11_ch1.html (~63 КБ):
Архитектура geom_10_r1 (geom11-стиль):
- 2-кол layout с col-side (XP card + cheat sheet + tip)
- Hero cyan-градиент + кнопка 'Начать §1'
- psel-grid: 6 параграфов + Финал; §1-§3 активны, §4-§6 и Финал locked
- sec секции с watermark (∿, маятник, E, ☰, ∿, муз. нота, ★)
- card теории + wg workshops + opt-btn кнопки

§1 Колебательное движение. Гарм. колебания:
- 3 теор. карточки (определение, T/ν/ω, гарм. колеб. x=Acos(ωt+φ₀))
- Инт. 1: Oscillogram с ползунками A, ω, φ (live-анимация)
- Инт. 2: Расчёт T,ν,ω (5 задач input)
- Инт. 3: Свойства колеб. (5 MC)
- Босс §1: 5 этапов, +65 XP

§2 Маятники:
- 2 теор. карточки (пружинный T=2π√(m/k), матем. T=2π√(l/g))
- Инт. 1: SpringMass + Pendulum side-by-side с 4 ползунками (m,k,l,g)
- Инт. 2: Расчёт T (5 input)
- Инт. 3: Как изменится T (5 MC)
- Босс §2: 5 этапов, +70 XP

§3 Превращения энергии:
- 2 теор. карточки (формулы W_к, W_п; закон сохранения W_мех=kA²/2)
- Инт. 1: EnergyView с ползунками A, ω (3 кривые в реал. времени)
- Инт. 2: Расчёт энергии (5 input)
- Инт. 3: Превращения энергии (5 MC)
- Босс §3: 5 этапов, +65 XP

§4-§6 и Финал — stub-карточки 'в разработке (W2)'.

LocalStorage: physics11_ch1_*, physics11_xp (общий со всем курсом)
Server sync: /api/textbooks/physics-11-ch1/progress
2026-05-29 17:52:47 +03:00
Maxim Dolgolyov f999ad550e feat(phys10 ch3 wave5 + final): §24 «Энергия конденсатора» + Финал Главы 3 (7 боссов) 2026-05-29 17:48:13 +03:00
Maxim Dolgolyov 22b95ed072 feat(phys11 W0): инфра — миграция БД, phys-fx.js, hub + 8 stub-глав
Миграция 031_physics_11_hub.sql:
- hub textbook 'physics-11' (cyan, sort 12, para_count 45)
- 8 children по главам: ch1 cyan, ch2 violet, ch3 amber, ch4 blue,
  ch5 pink, ch6 green, ch7 rose, ch8 indigo

frontend/js/phys-fx.js (~360 строк):
- Глобальный requestAnimationFrame-цикл (Ticker) с подписками
- util.subscribe/unsubscribe + IntersectionObserver-пауза невидимых
- util.svgFrame, util.axes, util.slider — общие хелперы
- PHYS.Oscillogram: гарм. колебания с амплитудой/частотой/фазой/затуханием
- PHYS.SpringMass: пружинный маятник (T=2π√(m/k)) с зигзаг-пружиной
- PHYS.Pendulum: математический маятник (T=2π√(l/g)) с дугой

frontend/textbooks/physics_11_hub.html:
- Header cyan-gradient + watermark ФИЗИКА
- 4-кол grid карточек глав (8 шт., responsive)
- Прогресс-бар курса + API /api/textbooks/physics-11/children

frontend/textbooks/physics_11_ch1..ch8.html:
- Stub-страницы по образцу geometry_10_r1..r4 (W0)
- Список параграфов с ключевыми формулами + 'Будет добавлено в волне WN'
- Каждая глава со своей темой (gradient, watermark, цветами)
- phys-fx.js подключён сразу (ready для W1+)

backend/scripts/gen_phys11_stubs.js — генератор для повторных сборок.
2026-05-29 17:42:36 +03:00
Maxim Dolgolyov 774b54afc8 feat(phys10 ch3 wave4): §22 «Напряжение» + §23 «Конденсаторы» 2026-05-29 17:41:19 +03:00
Maxim Dolgolyov dfc17ae717 feat(phys10 ch3 wave3): §20 «Линии поля» + §21 «Работа и потенциал» 2026-05-29 17:34:50 +03:00
Maxim Dolgolyov de1dbea8aa feat(phys10 ch3 wave2): §18 «Поле» + §19 «Напряжённость и суперпозиция» 2026-05-29 17:27:35 +03:00
Maxim Dolgolyov 1611e4b461 feat(phys10 ch3 wave1): §16 «Заряд» + §17 «Закон Кулона» 2026-05-29 17:21:04 +03:00
Maxim Dolgolyov 07adcbd108 feat(phys10 ch2 wave3 + final): §15 «Цикл Карно» + Финал Главы 2 (5 боссов) 2026-05-29 17:13:22 +03:00
Maxim Dolgolyov f2398dd078 feat(phys10 ch2 wave2): §13 «Количество теплоты» + §14 «Первый закон ТД»
Наполнены параграфы §13 и §14 (build_p13, build_p14) — теория, формулы,
4 интерактива каждый.

§13:
- 3 теоретические карточки (Q=cmΔT, фазовые переходы, баланс)
- ИНТ1: универсальный калькулятор Q (4 режима: нагрев/плавл/исп/сгор)
- ИНТ2: SVG-график нагревания льда → воды → пара (4 сегмента)
- ИНТ3: DnD-сортер 6 явлений → 4 типа процессов
- ИНТ4: тренажёр 6 задач

§14:
- 3 теоретические карточки (формулировка, изопроцессы, адиабата)
- ИНТ1: визуализатор первого закона с бар-чартом Q, ΔU, A для 4 процессов
- ИНТ2: калькулятор Q = ΔU + A (3 режима поиска)
- ИНТ3: квикфайр 'что неизменно' (T/V/p/Q)
- ИНТ4: тренажёр 5 задач

Файл: 1537 → 2325 строк. KaTeX-делимитеры, renderMath, secNav, wireReadBtn.
2026-05-29 17:06:13 +03:00
Maxim Dolgolyov e1a694ed90 feat(phys10 ch2 wave1): §11 «Внутренняя энергия» + §12 «Работа в ТД» 2026-05-29 16:58:44 +03:00
Maxim Dolgolyov 5e9bafb20c feat(phys10 ch1 wave5 + final): §9 «Испарение» + §10 «Влажность» + Финал Главы 1 (7 боссов) 2026-05-29 16:51:43 +03:00
Maxim Dolgolyov 4154e0b791 feat(phys10 ch1 wave4): §7 «Твёрдые тела» + §8 «Жидкости» 2026-05-29 16:42:20 +03:00
Maxim Dolgolyov 2b653c4655 feat(phys10 ch1 wave3): §5 «Уравнение состояния» + §6 «Изопроцессы» (PV/VT/PT диаграммы) 2026-05-29 16:35:13 +03:00
Maxim Dolgolyov b0c024be76 feat(geom10 r4 viz): переделаны все 6 SVG-рисунков — больше деталей, цветовая кодировка
§11 ПДСК:
- Расширил сцену до 460×340, осей до 3.4 единиц
- Добавил тики 1/2/3 на каждой оси с цветными цифрами
- Точка M(2;1;3) показана с реальными координатами + пунктирные проекции на плоскость Oxy, оси Ox/Oy, ось Oz
- Маркер на проекции M в плоскости Oxy

§11 Расстояние:
- A(0;0;0), B(2;2;2) — простые координаты
- Прямоугольный параллелепипед-подсказка с цветными рёбрами:
  Δx=2 красное, Δy=2 зелёное, Δz=2 синее (с подписями)
- Бледные пунктирные рёбра остальной части коробки
- Жирная фиолетовая главная диагональ AB
- Маркер прямого угла в углу — иллюстрирует 3D-Пифагор

§12 Сложение:
- Параллелограмм-подсказка (стрелка b из O + пунктир B→C)
- Треугольник: a красный из O, b зелёный из конца a
- Сумма a+b — толстая фиолетовая диагональ
- Подпись 'правило треугольника'

§12 Базис:
- Толстые i (красный), j (зелёный), k (синий) — 3.4 ширина
- Вектор a = 2i + 1.5j + 1.5k показан как ломаная-разложение:
  2i (бледно-розовый) → 1.5j (бледно-зелёный) → 1.5k (бледно-синий)
- Итог — толстый фиолетовый с подписью разложения
- Цифры коэффициентов на каждом сегменте

§13 Скалярное произведение:
- Векторы a, b в плоскости z=0 (без лишней глубины)
- Линия проекции (b → точка проекции на a) — серый пунктир
- Отрезок |b|·cos φ — толстый оранжевый вдоль a (геометрический смысл!)
- Маркер прямого угла на проекции
- Угол φ амбер
- Подпись '|b|·cos φ' над отрезком

§14 Куб в координатах:
- Подсветка цветных осей (не серых) + тики '1'
- Координаты всех 8 вершин показаны как (x;y;z) рядом с буквами
- Главная диагональ AC₁ — толстый фиолетовый пунктир с подписью '|AC₁|=√3'
- Сцена расширена до 500×360
2026-05-29 16:27:47 +03:00
Maxim Dolgolyov 7acc606cc2 feat(phys10 ch1 wave2): §3 «Идеальный газ» + §4 «Температура» + симуляции 2026-05-29 16:25:24 +03:00
Maxim Dolgolyov 3116f9d815 feat(phys10 ch1 wave1): §1 «МКТ» + §2 «Количество вещества» + симуляция броуновского движения 2026-05-29 16:18:53 +03:00
Maxim Dolgolyov d387018ee5 feat(geom10 W14): r4 (Координаты и векторы) переписан в стиле geom11 — финал курса
Раздел 4 §11-§14 + Финал курса + МЕГА-АЧИВКА stereo10_master:
- §11 Координаты: 3 карточки + SVG ПДСК + SVG расстояния + 3 интерактива + Босс §11 (+70 XP)
- §12 Векторы: 3 карточки + SVG сложения + SVG базиса + 3 интерактива + Босс §12 (+70 XP)
- §13 Скаляр. произв.: 3 карточки + SVG + 3 интерактива + Босс §13 (+70 XP)
- §14 Применение: алгоритм + SVG куба в коорд. + 3 интерактива + Босс §14 (+80 XP)
- Финал: 4 интегр. босса + celebration → ачивка stereo10_r4_master + 120 XP

★ ГЛАВНАЯ МЕХАНИКА: если у пользователя есть все 4 ачивки разделов
(stereo10_r1_master + r2 + r3 + r4) — автоматически выдаётся МЕГА-АЧИВКА
stereo10_master + 200 XP супер-бонус. Если каких-то ачивок нет —
celebration показывает список недостающих разделов.

Архитектура geom11_ch1:
- 2-кол layout с sticky col-side (XP/cheat sheet)
- Hero с amber-фоном (#78350f→#d97706→#fcd34d)
- psel-grid тапы для переключения параграфов
- formula-plate для красивых формул
- KaTeX onload renderMathInElement

Тема: amber (--pri:#d97706, --pri2:#b45309)
LocalStorage: geometry10_r4_*, geometry10_achievements (общий)

ИТОГ: Геометрия 10 (5 файлов: hub + r1-r4) переписана в едином стиле geom11.
4 раздела, 14 параграфов, ~50 интерактивов, ~30 боссов, 5 ачивок.
2026-05-29 16:16:02 +03:00
Maxim Dolgolyov 573de62963 feat(phys10 phase0): skeleton + миграция + phys.js модуль (37 §, 6 глав)
- Миграция 030_physics_10_hub.sql: hub physics-10 + 6 ch (color amber, sort 11, 37 §)
- frontend/textbooks/physics_10_hub.html (hub, yellow/amber palette, 6 chapter cards, финал placeholder)
- 6 ch-файлов physics_10_ch{1..6}.html: skeleton с PARAS, sec-nodes, SIDEBARS, TIPS,
  STUB-builder'ами для всех 37 §§ + 6 финалов, POLISH CSS, ICONS, 2D-хелперы,
  подключения phys.js + g3d.js
- frontend/js/phys.js: новый модуль window.PHYS с 21 экспортом —
  drawArrow, fieldLinesPointCharge, chargeMark, magneticFieldGrid, molecule,
  createGasSim, batteryEMF, resistor, capacitorSymbol, ammeterSymbol,
  voltmeterSymbol, lightbulbSymbol, inductorSymbol, wire, CONST + 6 конвертеров единиц

Все ch следуют паттерну algebra_11_ch1.html (Wave 5). Авторы не указаны.
Phase 1+ — наполнение содержанием по учебнику «Физика 10» (Беларусь, 2019).

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-05-29 16:12:08 +03:00
Maxim Dolgolyov 663459a675 feat(geom10 W13): r3 (Перпендикулярность) переписан в стиле geom11
Раздел 3 §7-§10 + Финал в архитектуре geom11_ch1:
- 4 параграфа: §7 ⊥-прямая, §8 расстояния, §9 ТТП, §10 ⊥-плоскости
- 5 финальных боссов (vs 4 в r1/r2)
- 2-кол layout с sticky col-side (XP/cheat sheet)
- Hero с rose-фоном (#7f1d1d→#e11d48→#fda4af)
- psel-grid тапы для переключения параграфов
- KaTeX onload renderMathInElement

Контент:
- §7 ⊥-прямая: SVG определения + признака + 6 карточек + 3 интерактива + Босс §7 (+70 XP)
- §8 Расстояния: 4 типа SVG + детальный SVG + 4 карточки + 3 интерактива (вкл. куб с √2) + Босс §8 (+70 XP)
- §9 ТТП: SVG наклонной+проекции + SVG ТТП + 3 карточки + 3 интерактива + Босс §9 (+70 XP)
- §10 ⊥-плоскости: SVG двугранного угла + SVG признака + 4 карточки + 3 интерактива + Босс §10 (+75 XP)
- Финал: 5 боссов + celebration → ачивка stereo10_r3_master + 130 XP

Тема: rose (--pri:#e11d48, --pri2:#be123c)
LocalStorage: geometry10_r3_*
2026-05-29 16:08:46 +03:00
Maxim Dolgolyov d5bb907adc feat(geom10 W12): r2 (Параллельность) переписан в стиле geom11
Раздел 2 §4-§6 + Финал по архитектуре geom11_ch1:
- 2-кол layout с sticky col-side (XP/cheat sheet)
- Hero с emerald-фоном + кнопка 'Начать §4'
- psel-grid тапы для переключения параграфов
- sec секции с watermark, ленивая сборка через BUILDERS
- card теории + wg workshop боксы для тренажёров
- KaTeX onload renderMathInElement

Контент:
- §4 Прямые в пространстве: 4 теор. карточки + 3 SVG (пересек./парал./скрещ.) + куб с 3 типами пар + 3 интерактива + Босс §4 (+65 XP)
- §5 Прямая и плоскость: 3 карточки + 3 SVG (a⊂α, a∩α=M, a∥α) + признак SVG + 3 интерактива + Босс §5 (+65 XP)
- §6 Две плоскости: 3 карточки + 2 SVG (пересек./парал.) + признак SVG + 3 интерактива + Босс §6 (+65 XP)
- Финал: 4 интегральных босса + celebration → ачивка stereo10_r2_master + 100 XP

Тема: emerald (--pri:#059669, --pri2:#047857, gradient #064e3b → #059669 → #86efac)
LocalStorage: geometry10_r2_*
2026-05-29 16:01:13 +03:00
Maxim Dolgolyov 09a292eca6 feat(geom10 W11): r1 переписан в стиле geom11 — SPA с psel-tabs, hero, sidebar
Новая архитектура (повторяет geom11_ch1):
- 2-кол layout (.main + col-side sticky XP/cheat sheet)
- Hero с анимированным фоном + кнопка 'Начать §1' + прогресс
- .psel-grid карточки параграфов (тапы переключения)
- .sec секции с watermark, ленивая сборка через BUILDERS
- .card теории с цветными card-icon (theory/rule/algo/example)
- .wg workshop боксы для тренажёров
- .spoiler детали (раскрывающиеся блоки)
- KaTeX onload renderMathInElement (фикс race)

Сохранён весь контент:
- §1: 5 теоретических карточек + 3 интерактива + Босс §1 (+60 XP)
- §2: 3 карточки + 3 интерактива + Босс §2 (+65 XP)
- §3: 4 карточки + 4-шаговая анимация шестиугольного сечения + 3 интерактива + Босс §3 (+70 XP)
- Финал: 4 интегральных босса + celebration → ачивка stereo10_r1_master + 100 XP

Stereo3D через/js/stereo3d.js (синхронная загрузка)
LocalStorage: geometry10_r1_progress, geometry10_r1_achievements, geometry10_r1_quiz_*, geometry10_r1_boss-*
Server sync via /api/textbooks/geometry-10-r1/progress
2026-05-29 15:54:33 +03:00
Maxim Dolgolyov 4533ef14ed feat(geom10 W10): hub переписан в стиле geom11 — 4-кол grid + финал курса + шпаргалка
- KaTeX: onload-инициализация (фикс race с DOMContentLoaded)
- 4-кол grid карточек разделов (mobile/tablet/desktop responsive)
- Цвета карточек: r1 blue, r2 emerald, r3 rose, r4 amber (соответствуют разделам)
- Watermarks: △ ∥ ⊥ →
- Финал курса (аккордеон):
  - Шпаргалка курса: 4 карточки с формулами по разделам (Эйлер, признаки парал./перп., ТТП, расстояние, скаляр.)
  - 9 интегрированных боссов с подсказками + tolerance
  - Master ачивка stereo10_course_master + 100 XP
  - CTA при прохождении
- Прогресс: TOTAL=14, обновлены CH_PARA/CH_IDX
- localStorage keys: geometry10_course_master, geometry10_course_bosses, geometry10_xp
2026-05-29 15:45:22 +03:00
Maxim Dolgolyov 3869cebe95 feat(geom10 W9): Финал Раздела 4 + МЕГА-АЧИВКА stereo10_master (Геометрия 10 пройдена!)
Финал R4:
- Босс 1 Координаты и расстояния (4 этапа, +30 XP)
- Босс 2 Векторы (4 этапа, +30 XP)
- Босс 3 Скалярное произведение (4 этапа, +35 XP)
- Босс 4 Сборная (5 этапов, +55 XP — диагональ куба √3, 2√3; cos углов диагоналей)
- Celebration: ачивка stereo10_r4_master + 120 XP бонус

ГЛАВНАЯ МЕХАНИКА: если в localStorage есть все 4 ачивки разделов
(stereo10_r1_master + stereo10_r2_master + stereo10_r3_master + stereo10_r4_master)
автоматически выдаётся МЕГА-АЧИВКА stereo10_master + 200 XP супер-бонус.
Если каких-то ачивок нет — celebration показывает список недостающих разделов.

sec-nav: финал-таб разблокирован, refreshTabs учитывает {f1..f4}.

ИТОГ: Геометрия 10 полностью завершена.
- 4 раздела, 14 параграфов
- ~140 интерактивов (квизы MC + input + tnp/слайдеры)
- 4 финала, 20+ боссов
- 5 ачивок: r1..r4 + master
- stereo3d.js (~650 строк) для всех 3D-рисунков
2026-05-29 15:36:58 +03:00
Maxim Dolgolyov c2a2497e49 feat(geom10 W8): Раздел 4 §11-§14 — Координаты и векторы (полная реализация)
§11 Координаты в пространстве:
- SVG ПДСК: 3 цветные оси + точка M(2;3;4) с пунктирными проекциями
- SVG расстояния: параллелепипед на разностях координат + диагональ AB
- 6 теоретических карточек (ПДСК, координаты, пл-сти, расстояние, середина, особые точки)
- 3 тренажёра: где точка (6), расстояние (5, с √2/√3), середина (5)
- Босс §11: 5 этапов, +70 XP

§12 Векторы:
- SVG сложения: параллелограмм + правило треугольника (a, b, a+b)
- SVG базиса: i, j, k единичные векторы вдоль осей + вектор a с проекциями
- 6 теоретических карточек (определение, равенство, сложение, k·a, координаты, коллинеарность)
- 3 тренажёра: действия (5), AB координаты (5), коллинеарность (5)
- Босс §12: 5 этапов, +70 XP

§13 Скалярное произведение:
- SVG: 2 вектора a, b из O + угол φ между ними
- 6 теоретических карточек (определение, координатная формула, свойства, ⊥, угол, знак)
- 3 тренажёра: вычисление (5), перпендикулярность (5), cos угла (4)
- Босс §13: 5 этапов, +70 XP

§14 Применение векторно-координатного метода:
- SVG: куб ABCDA1B1C1D1 в координатах с ребром 1
- Алгоритм решения на formula-plate
- 6 теоретических карточек (уравнения пл-сти, угол прямых/прямой+пл-сть/пл-стей, расстояние, когда применять)
- 3 тренажёра: куб в координатах (5), угол через скаляр (4), выбор метода (5)
- Босс §14: 6 этапов, +80 XP

normalizeAns: общая утилита (≡ r3) + поддержка координат через ; или ,
Финал R4 — stub до W9 (4 босса + ачивка stereo10_master = главная награда курса).
2026-05-29 15:33:58 +03:00
Maxim Dolgolyov 22675fd48e chore: убраны упоминания авторов из всех учебников
Материал учебников теперь полностью наш (LearnSpace), оригинальные
авторы (Арефьева, Латотин, Казаков и др.) убраны из:
- поля textbooks.author в БД (миграция 029);
- footer'ов hub-файлов (9 файлов).

Содержание теории и интерактивов не затронуто.
2026-05-29 15:27:21 +03:00
Maxim Dolgolyov 7f045737d3 feat(geom10 W7): Финал Раздела 3 — 5 боссов + ачивка stereo10_r3_master
- Босс 1 Прямая ⊥ плоскость (4 этапа, +30 XP)
- Босс 2 Расстояния (4 этапа, +30 XP)
- Босс 3 Угол + ТТП (4 этапа, +35 XP, поддержка √2/2, 1/√3 и т.п.)
- Босс 4 ⊥-плоскости (4 этапа, +30 XP)
- Босс 5 Сборная (5 этапов, +45 XP — диагональ куба √3, sin угла 1/√3)
- Celebration: ачивка stereo10_r3_master + 130 XP бонус
- sec-nav: финал-таб разблокирован, refreshTabs учитывает {f1..f5}
- Состояние: STATE.bosses{f1..f5} + geometry10_achievements в localStorage
2026-05-29 15:26:04 +03:00
Maxim Dolgolyov cf4507a4d6 feat(geom10 W6): Раздел 3 §9 + §10 — угол с плоскостью, ТТП, перпендикулярность плоскостей
§9 Угол между прямой и плоскостью:
- SVG определения: A, H, B + перпендикуляр AH (красный), наклонная AB (синий), проекция HB (зелёный), угол φ
- SVG ТТП: AH⊥α, BC⊂α, HB⊥BC ⇒ AB⊥BC (прямая теорема)
- 6 теоретических карточек (определения, угол, прямая+обратная ТТП, равные наклонные, формулы tg/sin/cos, ТТП в кубе)
- 3 тренажёра: элементы (6), углы в кубе (5, с поддержкой √2/2, sqrt(2)/2, 0.707), применима ли ТТП (5)
- Босс §9: 5 этапов, +70 XP

§10 Перпендикулярность плоскостей:
- SVG двугранного угла: 2 полуплоскости с общим ребром l, линейный угол φ между MP⊥l и MQ⊥l
- SVG признака α⊥β: α содержит l⊥β
- 6 теоретических карточек (двугранный угол, линейный угол, ⊥-плоскости, признак, свойство, ⊥ в кубе)
- 3 тренажёра: двугранный угол (5), признак ⊥ плоскостей (5), ⊥ грани куба (5)
- Босс §10: 6 этапов, +75 XP

Финал R3 остаётся stub до W7.
2026-05-29 15:20:40 +03:00
Maxim Dolgolyov f2933a6186 fix(geom11 ch4): сырой KaTeX в <option> §9 → unicode-текст (a, b, α°, d₁, d₂) 2026-05-29 15:18:32 +03:00