Commit Graph

522 Commits

Author SHA1 Message Date
Maxim Dolgolyov c3d6af8757 fix(exam-prep): normalize LaTeX in dashboard preview text
Recent-attempts widget on /exam-prep/:examKey was showing raw LaTeX
like '\dfrac{7}{9}' because stripPreview only removed HTML tags.
Now it also converts common LaTeX to readable unicode (fractions →
a/b, \sqrt → √, \cdot → ·, comparisons → ≤≥≠, Greek letters, etc.)
before truncating.

KaTeX rendering would be overkill for a 100-char preview row; this
just makes the existing text legible.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-29 16:45:59 +03:00
Maxim Dolgolyov 4154e0b791 feat(phys10 ch1 wave4): §7 «Твёрдые тела» + §8 «Жидкости» 2026-05-29 16:42:20 +03:00
Maxim Dolgolyov 5356096349 fix(api): auto-stringify object bodies in LS.api (apiFetch)
LS.api was passing raw object bodies straight to fetch(), which coerces
them to '[object Object]' — the server then parsed empty JSON and 400'd
on missing fields. This silently broke every POST that uses LS.api
directly (EP.api.startMock, saveAttempt, mockAnswer, etc.).

LS.post already stringified, so most call sites worked. Now apiFetch
mirrors that behavior for plain objects, while FormData / Blob /
URLSearchParams / ArrayBuffer / strings still pass through unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-29 16:40:42 +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
Maxim Dolgolyov e6a1a697bd feat(geom10 W5): Раздел 3 §7 + §8 — Перпендикулярность и расстояния
§7 Перпендикулярность прямой и плоскости:
- SVG определения: плоскость α + вертикальная l + 4 прямые в α с маркерами 90°
- SVG признака: l + m + n пересекающиеся в O, прямые углы
- 6 теоретических карточек (определение, признак, свойства, параллельность+⊥, существование, куб)
- 3 тренажёра: перпендикулярна ли (6), применение признака (5), ⊥ в кубе (5)
- Босс §7: 5 этапов, +70 XP

§8 Расстояния:
- 4 случая side-by-side (точка→плоскость / прямая∥плоскость / парал. плоскости / скрещ. прямые)
- Детальный SVG: точка A над плоскостью + перпендикуляр AO + наклонная AB
- 6 теоретических карточек
- 3 тренажёра: расстояния в кубе (6, с поддержкой √2 / sqrt(2) / корень), какой тип задачи (5), верно/неверно (5)
- Босс §8: 5 этапов, +70 XP
- normalizeAns: общая утилита для ввода √2, sqrt(2), корень2, 1.41, 1.414

§9, §10, Финал — stub до W6/W7.
2026-05-29 15:14:50 +03:00
Maxim Dolgolyov 169a5130ba feat(geom11 phase5 final): итоговая шпаргалка + 9 боссов + ачивка «Магистр геометрии 11»
Финал курса Геометрия 11 заменил placeholder-аккордеон полноценным
контентом по образцу algebra_11_hub.html.

Контент:
- 4 mini-карточки шпаргалки (Раздел 1 Призма+Цилиндр; Раздел 2
  Пирамида+Конус; Раздел 3 Сфера+Шар+Многогранники; Раздел 4
  Повторение) с ключевыми формулами в KaTeX.
- 9 интегрированных боссов: Призма+Цилиндр (3.46), Апофема пирамиды
  (5), Развёртка конуса (120°), Шар в кубе (113.04), Уравнение сферы
  (R=3), Октаэдр (8 граней), 3D-вектор (длина 3), Диагональ
  параллелепипеда (3), Магистр стереометрии — тетраэдр в кубе (8.49).
- Lazy-render при первом раскрытии (renderFinBosses).
- При 9/9 → ачивка geom11_master «Магистр геометрии 11», +100 XP,
  confetti, подсветка ach-strip, кнопка «К каталогу учебников».
- localStorage geometry11_course_bosses сохраняет прогресс боссов.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-05-29 15:14:04 +03:00
Maxim Dolgolyov 87a057f5b9 feat(geom10 W4): Финал Раздела 2 — 4 босса + ачивка stereo10_r2_master
- Босс 1 Прямые в пространстве (4 этапа, +35 XP)
- Босс 2 Прямая и плоскость (4 этапа, +35 XP)
- Босс 3 Две плоскости (4 этапа, +35 XP)
- Босс 4 Сборная (5 этапов, +45 XP)
- Celebration: ачивка stereo10_r2_master + 100 XP бонус
- sec-nav: финал-таб разблокирован, отмечается при победе над всеми 4 боссами
- Состояние: STATE.bosses{f1..f4} + geometry10_achievements в localStorage
2026-05-29 15:08:52 +03:00
Maxim Dolgolyov eb19ce3cf9 fix(auth): include avatar_url in login response + lazy refresh stale cache
Login was only returning {id, email, name, role}, so localStorage.ls_user
never had avatar_url for sessions started before today — and the sidebar
fell back to initials forever. Fixes:

  • login response now includes avatar_url
  • renderNavAvatar detects 'undefined' (cache predates the field) vs
    'null' (verified absent) and fires a one-shot /auth/me refresh in
    the background, then re-paints. Self-healing for existing sessions
    without forcing re-login.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-29 15:07:16 +03:00
Maxim Dolgolyov 4423a72635 feat(geom11 ch4 wave3 + final): §11 «Построения» + Финал Раздела 4 2026-05-29 15:06:29 +03:00
Maxim Dolgolyov 46d373752c fix(profile): visual frame previews in shop + sidebar avatar sync
Shop items of type 'frame' now render a real avatar-sized preview with
the frame's CSS applied (instead of a generic lucide icon) so buyers
see exactly what they're paying for. Title items get a tag-shaped
preview in their color. The avatar-frames section above the shop also
shows the user's actual avatar inside the frame circles, not 'LS' text.

Sidebar nav-avatar now:
  • renders the uploaded avatar_url instead of always showing initials
    (LS.initPage + new LS.refreshNavAvatar helper)
  • picks up frame CSS on every page via applyCosmetics — previously
    only dashboard.html applied it
  • repaints immediately after picking/deleting an avatar preset
    (avPickPreset / avDelete now call LS.setUser + LS.refreshNavAvatar)

Backend getMyActive resolves avatar_frame to {id, css} for both
gamification frames ('fire', 'crown', ...) and shop-purchased frames
('shop_<id>'), so the client doesn't need a second round-trip to
look up the CSS.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-29 15:04:27 +03:00
Maxim Dolgolyov 8e39993bb0 feat(geom10 W3): Раздел 2 §4-§6 — Параллельность (полная реализация)
§4 Прямые в пространстве:
- 3 случая side-by-side (пересек./парал./скрещ.)
- Куб с 3 типами пар рёбер подсвечены тремя цветами
- 6 теоретических карточек (определения, признак скрещ., теорема о парал., угол, расстояние)
- 3 тренажёра: тип пары (7), угол между прямыми (5), верно/неверно (5)
- Босс §4: 5 этапов, +65 XP

§5 Прямая и плоскость:
- 3 случая (a⊂α / a∩α=M / a∥α)
- Признак параллельности прямой и плоскости (SVG)
- 4 теоретические карточки
- 3 тренажёра: какой случай (6), применение признака (5), параллельность в кубе (5)
- Босс §5: 5 этапов, +65 XP

§6 Две плоскости:
- 2 случая (пересекаются по прямой / параллельны)
- Признак параллельности плоскостей через 2 пересек. прямые
- 4 теоретические карточки
- 3 тренажёра: расположение (5), достаточно ли условий (5), свойства (5)
- Босс §6: 5 этапов, +65 XP

Финал R2 — stub до W4 (4 босса + ачивка stereo10_r2_master).
2026-05-29 15:04:10 +03:00
Maxim Dolgolyov 788d612716 feat(geom11 ch4 wave2): §10 «Координаты и векторы 3D» + 3D-визуализатор 2026-05-29 15:00:13 +03:00
Maxim Dolgolyov 3cc52e21b0 feat(exam9): link tasks to textbook + difficulty-ordered random + topic exclusion
Practice (random) now picks tasks by ascending difficulty so the first
slot is always level 1 and the session ramps up. Adds ?exclude= to drop
specific subtopics from the random pool, with a per-section checkbox
modal in the UI.

Each task carries a topic_ref (textbook chapter + paragraph) shown as
a 'Учить тему · §N' button next to the solution, deep-linking to the
right section of /textbook/<slug>. Mapping seeded for all 15 math9
subtopics in migration 028.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-29 14:55:47 +03:00
Maxim Dolgolyov 441321c598 feat(geom11 ch4 wave1): §8 «Планиметрия» + §9 «Площади и объёмы» (повторение) 2026-05-29 14:55:20 +03:00
Maxim Dolgolyov 0e52fedc2d feat(geom10 W2): Раздел 1 §3 Сечения + Финал R1 (4 босса + ачивка)
§3 Построения сечений:
- Hero: куб с шестиугольным сечением через M, N, P (4-шаговая анимация: точки → 2 ребра → 6 точек → заливка)
- 3 типа сечений куба: треугольник / прямоугольник / правильный шестиугольник
- Метод следов: куб с M, N, K и следом плоскости сечения на основании
- 4 теоретические карточки (определение, метод следов, параллельные сечения, max сторон)
- 3 тренажёра: тип многоугольника (6), max сторон (5), метод следов (5)
- Босс §3: 5 этапов, +70 XP

Финал раздела 1 (4 босса):
- Босс 1 Элементы тел (4 этапа, +35 XP)
- Босс 2 Аксиомы (4 этапа, +35 XP)
- Босс 3 Сечения (4 этапа, +35 XP)
- Босс 4 Сборная (5 этапов, +45 XP)
- Celebration: ачивка stereo10_r1_master + 100 XP бонус
- Прогресс хранится в STATE.bosses{f1..f4} + geometry10_achievements в localStorage
2026-05-29 14:54:52 +03:00
Maxim Dolgolyov bf794f76a6 feat(geom11 ch3 final): Финал Раздела 3 (5 боссов + ачивка) 2026-05-29 14:49:25 +03:00
Maxim Dolgolyov bfa7c46ef5 feat(geom10 W1): Раздел 1 §1 + §2 — Введение в стереометрию
§1 Пространственные фигуры:
- 5 hero-тел (призма/пирамида/цилиндр/конус/шар) через stereo3d
- Куб ABCDA1B1C1D1 с подсветкой диагонали AC1 и грани ABB1A1
- Прямая vs наклонная призма (side-by-side)
- 6 теоретических карточек (грани/рёбра, призма, пирамида, тела вращения, Эйлер, проекция)
- 3 тренажёра: узнавание тел (6 заданий), счёт элементов (6, формула Эйлера), 3D-крутилка куба (slider rotX/rotY)
- Босс §1: 5 этапов, +60 XP

§2 Прямые и плоскости:
- 3 SVG аксиом A1/A2/A3 + 3 SVG следствий
- 6 теоретических карточек (3 аксиомы + следствия + 4 способа задать плоскость + обозначения)
- 3 тренажёра: какая аксиома (6), можно ли задать плоскость (5), сколько плоскостей (5)
- Босс §2: 5 этапов, +65 XP

§3 + Финал — stub до Волны W2.
2026-05-29 14:48:30 +03:00
Maxim Dolgolyov fb12196cfa feat(geom11 ch3 wave3): §7 «Правильные многогранники» — 5 платоновых тел 2026-05-29 14:46:07 +03:00
Maxim Dolgolyov 451f6a66ea feat(geom11 ch3 wave2): §6 «Шар» + сегменты + вписанные/описанные 2026-05-29 14:39:06 +03:00
Maxim Dolgolyov 0284611263 feat(geom10 W0): инфра — миграция БД, stereo3d.js, hub + 4 stub-раздела
- Миграция 027: textbooks hub geometry-10 + 4 ребёнка (r1 blue, r2 emerald, r3 rose, r4 amber)
- frontend/js/stereo3d.js: библиотека 3D-проекций (Scene, CABINET/ISOMETRIC, cube/box/prism/pyramid/tetrahedron/plane/arrow/angle, авто-видимость рёбер)
- geometry_10_hub.html: 4 карточки разделов, общий прогресс, превью 4 тел через stereo3d
- 4 stub-файла разделов (r1-r4) с list параграфов и плашкой 'в разработке'
- backend/scripts/gen_geom10_stubs.js: генератор stub-файлов
2026-05-29 14:37:07 +03:00
Maxim Dolgolyov 3df79d081c feat(geom11 ch3 wave1): §5 «Сфера» + 3D + уравнение + сечения 2026-05-29 14:33:45 +03:00
Maxim Dolgolyov 4814d5edeb fix(static): корректный путь к /avatars (был на уровень выше реальной папки) 2026-05-29 14:33:30 +03:00
Maxim Dolgolyov 19ce8728e5 feat(avatars): 27 готовых пресет-аватаров + UI выбора для всех ролей
- backend/uploads/avatars/preset_01..27.png — иллюстрированные персонажи
- POST /api/avatar/preset — мгновенная установка без модерации
- GET  /api/avatar/presets — список доступных пресетов
- profile.html: галерея пресетов в модалке аватара, доступна студенту/учителю/админу
- кастомная загрузка с модерацией остаётся только для студентов
2026-05-29 14:30:24 +03:00
Maxim Dolgolyov 717ad3d0f5 feat(geom11 ch2 final): Финал Раздела 2 (5 боссов + ачивка) 2026-05-29 14:29:09 +03:00
Maxim Dolgolyov 15de0d914f feat(geom11 ch2 wave2): §4 «Конус» + 3D + развёртка 2026-05-29 14:26:11 +03:00
Maxim Dolgolyov dd0a54d8ca feat(geom11 ch2 wave1): §3 «Пирамида» + 3D + калькулятор 2026-05-29 14:21:23 +03:00
Maxim Dolgolyov c2b5d73913 feat(geom11 ch1 final): Финал Раздела 1 (5 боссов + ачивка) 2026-05-29 14:16:53 +03:00
Maxim Dolgolyov 6acdb72b39 feat(geom11 ch1 wave2): §2 «Цилиндр» + 3D-конструктор + сечения 2026-05-29 14:12:55 +03:00
Maxim Dolgolyov b6bb1d9f48 feat(geom11 ch1 wave1): §1 «Призма» + 3D-конструктор + калькуляторы 2026-05-29 14:07:51 +03:00
Maxim Dolgolyov b771c3d497 feat(geom11 phase0): skeleton + миграция + мини-3D движок g3d.js
- 026_geometry_11_hub.sql: hub geometry-11 (cyan, 11 параграфов) + 4 раздела
  (Призма и цилиндр, Пирамида и конус, Сфера и шар, Повторение).
- frontend/js/g3d.js: мини-3D движок для стереометрии.
  Векторная математика, матрицы 3x3, перспективная + изометрическая проекции,
  меши призмы/пирамиды/цилиндра/конуса, wireframe сферы, back-face culling
  через нормали, Z-sort, drag-to-rotate (mouse + touch), preset views.
- frontend/textbooks/geometry_11_hub.html: hub с палитрой cyan/sky,
  4 карточками разделов, аккордеон финала курса (placeholder Phase 5).
- frontend/textbooks/geometry_11_ch{1..4}.html: skeleton 4 разделов
  (через gen_geom11_chapters.js). Все включают: помощники KaTeX, SVG 2D
  (axes2D/plotFunc/pointWithDrop/asymptote/rightAngleMark/angleArcAuto/unitVec),
  ICONS, makeCard, setupSorter, gcd, wireReadBtn, secNav, search, sidebar,
  GEOM11 POLISH CSS + JS, подключение /js/g3d.js. STUB builder для всех 11
  параграфов + 4 финалов с demo-G3D viewer (призма/цилиндр/пирамида/конус/
  сфера-wireframe).
2026-05-29 12:45:20 +03:00
Maxim Dolgolyov 0cca1754e8 feat(alg11 phase4 final): итоговая шпаргалка + 7 боссов + ачивка «Магистр алгебры 11» 2026-05-29 12:31:12 +03:00
Maxim Dolgolyov e2f0bb61af feat(alg11 ch3 wave4 + final): §10 «Логарифмические неравенства» + Финал Главы 3 2026-05-29 12:26:14 +03:00
Maxim Dolgolyov c8385205b4 feat(alg11 ch3 wave3): §9 «Логарифмические уравнения» (4 метода + ОДЗ) 2026-05-29 12:19:43 +03:00
Maxim Dolgolyov 2a987f01d0 feat(alg11 ch3 wave2): §8 «Логарифмическая функция» + обратная к показательной 2026-05-29 12:15:24 +03:00
Maxim Dolgolyov aee927a3b1 feat(alg11 ch3 wave1): §7 «Свойства логарифмов» 2026-05-29 12:10:52 +03:00