Commit Graph

14 Commits

Author SHA1 Message Date
Maxim Dolgolyov 9d5a2959e1 fix(textbooks): кнопка «Шпаргалка» не открывала контент на desktop
На десктопе (>980px) .col-side уже видна как sticky-колонка справа в grid 1fr 280px.
Клик по кнопке #sidebar-btn добавлял .col-side-backdrop.show — backdrop с
z-index:9990 затемнял всю страницу, перекрывая sticky-aside. Со стороны
выглядело как «ничего не открылось» — на самом деле появлялась чёрная вуаль.

Фикс: @media(min-width:981px) скрывает #sidebar-btn и подавляет показ backdrop.
На мобайле (≤980px) кнопка и overlay работают как раньше.

Применено в 51 файле: physics 8/9/10 chN, algebra 7/9/10/11 chN + 8 ch2-3,
geometry 7/8/9/11 chN, geometry_10 r1-4.
2026-05-30 09:51:04 +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 219e488d7f fix(geom8): KaTeX в feedback — рендерить $...$ после установки innerHTML
В сообщениях feedback (после Проверить) формулы с $...$ показывались
как сырой LaTeX-источник, например 'Повтори: $S_1/S_2 = k^2.$'.
Причина: feedback() устанавливал innerHTML но не вызывал renderMath()
на этом элементе, поэтому KaTeX не обрабатывал формулы.

Добавлен try{renderMath(elm);}catch(e){} после установки innerHTML
во всех 3 файлах (ch1, ch2, ch3).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 16:05:21 +03:00
Maxim Dolgolyov 5ecae8a078 fix(geom8): кнопка Проверить — feedback теперь показывается
Баг: у элементов .feedback стоит inline style='display:none' и CSS-класс
.feedback с display:none. Класс .feedback.ok должен переключать на
display:block, но inline-стиль имеет ВЫСШУЮ специфичность и перекрывает
классовый display:block.

В итоге onclick-обработчики работали корректно (вызывали feedback()),
но сообщение оставалось скрытым из-за inline display:none.

Симптом: 'нажимаешь Проверить — ничего не происходит' в боссах, DnD,
тренажёрах, квизах — везде где есть .feedback элемент.

Фикс: функция feedback() теперь явно сбрасывает elm.style.display='block'
после установки класса. Добавлен null-check на elm.

Затронуто 3 файла (ch1, ch2, ch3). Все feedback-элементы во всех
параграфах теперь показываются после клика по Проверить.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 15:58:50 +03:00
Maxim Dolgolyov e0d36b45c0 fix(geom8 ch3): убрать наложения двух треугольников и подписей
Системная переработка SVG-рисунков с парой треугольников ABC + A'B'C':
второй треугольник теперь спатиально отделён от первого (gap 30-50px),
viewBox расширен под обе фигуры + поля для подписей, аннотации перенесены
к верху/низу области.

Затронутые места:
1. §3 ИНТЕРАКТИВ 1 (slider k) — T2 анкорится в B2x=Cx+50, динамический W
2. §5 Card 5.1 — viewBox 350×195, label k= перенесён к низу
3. §5 ИНТЕРАКТИВ 2 Step 1 — viewBox 320×170, gap 37px, label наверху
4. §6 ИНТЕРАКТИВ 2 Step 1 — viewBox 330×165, gap 39px, label наверху
5. §7 Card 7.1 — viewBox 310×185, gap 38px, ratio внизу
6. §7 ИНТЕРАКТИВ 2 Step 1 — viewBox 310×160, gap 33px
7. §8 «через параллель» — полный редизайн viewBox 340×250: E внутри,
   биссектриса с метками, CE параллельная с штрихами, BD/DC цветные
8. §9 Card 9.1 — gap 44px, label вверху
9. §9 ИНТЕРАКТИВ 2 Step 1 — gap 38px, label вверху
10. §9 БОСС task 1 — viewBox 310×158, gap 42px, label вверху

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 15:55:09 +03:00
Maxim Dolgolyov ad5435dace fix(geom8): убрать LaTeX-квадратики □ (\square/\blacksquare) — заменить на 'ч.т.д.'
В концах доказательств использовался LaTeX-маркер \square (или
\blacksquare) для QED. KaTeX рендерит его как пустой квадрат U+25A1
который во многих браузерах отображается как 'тофу' (битый глиф).

Заменены во всех 3 главах геометрии:
- \$\square\$  → <b>ч.т.д.</b> (HTML текст)
- \$\blacksquare\$ → <b>ч.т.д.</b>
- \quad\square в $$ → закрытие $$ + 'ч.т.д.'
- \square ABCD (как символ параллелограмма) → просто ABCD

Затронуто: 29 в ch1 + 26 в ch2 + 1 в ch3.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 15:39:53 +03:00
Maxim Dolgolyov d7d74b1553 fix(geom8 ch3): SVG в §3/5/6/9 + раскрытие сокращений УУ/СУС/ССС
Sокращения признаков подобия везде заменены на полные русские названия:
- УУ/ДД → 'по двум углам' / 'Признак по двум углам'
- СУС/СДС → 'по двум сторонам и углу' / 'Признак по двум сторонам и углу между ними'
- ССС → 'по трём сторонам' / 'Признак по трём сторонам'
Сокращения оставлены только в скобках после полного имени для первого
упоминания (например, 'по двум углам (УУ)'). Затронуты: PARAS, SIDEBARS,
TIPS, заголовки виджетов в §4-§9, finale, DnD-чипы и квизы.
В KaTeX-выражениях формальных доказательств SAS/SSS оставлены (это
международная нотация конгруэнтности).

SVG-фиксы:
- §3 (карточка 3.1): viewBox расширен 360×155, маленький треугольник
  отодвинут на 50px от большого (B'=245,135), не накладывается.
- §5 (карточка 5.1): viewBox 360×160, маленький треугольник на 45px
  правее.
- §6 (карточка 6.1): viewBox 300×192 (выше), треугольник смещён вниз,
  аннотации перенесены к низу карточки.
- §8 (доказательство через параллель): полный редизайн SVG (viewBox
  0 -30 340 215): точка E чётко отделена от A, добавлены штрихи
  параллельности CE∥AD, подпись 'CE ∥ AD'.
- §9 (слайдер k): динамическое размещение B2x =
  Math.max(C1x+30, 200), второй треугольник не накладывается на
  первый при больших значениях k.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 15:36:18 +03:00
Maxim Dolgolyov 70c6fe0054 feat(geom8): Wave 5 — финал Главы 3 (шпаргалка, карта связей, 7 боссов)
Часть 1 — Итоговая шпаргалка: 9 mini-cards с SVG-иконкой и формулой
в KaTeX для каждого § (от Фалеса до отношения площадей).

Часть 2 — Интерактивная карта связей (SVG 620×340):
центральный узел 'Подобие треугольников' → 3 признака (УУ, СУС, ССС)
→ следствия (Фалес, прямая||стороне, биссектриса, площади, m:n).
Клик подсвечивает связи и показывает описание с KaTeX.

Часть 3 — 7 боссов (по 10 XP):
  Босс 1: параллель MN — k=8/12, AN=12
  Босс 2: биссектриса AB=15 AC=10 BC=14 — BD=8.4, DC=5.6
  Босс 3: УУ+площади k=1.5, S=12 — S'=27
  Босс 4: деление 20 см в 3:2 — AC=12, CB=8
  Босс 5: СУС+косинус AB=8 AC=12 ∠=60° k=1.5 — A'B'=12, A'C'=18, BC≈11
  Босс 6: высоты и площади k=2 — h'=3, S=36
  Босс 7: средняя линия M середина AB, MN∥BC — MN=10.5, AN/NC=1, ratio=0.25

Часть 4 — Финальная плашка: confetti + achievement
'Мастер подобия Главы 3' + 50 XP бонус + кнопка перехода к Главе 4.

File: 4095 → 4709 LOC. ГЛАВА 3 ПОЛНОСТЬЮ ЗАВЕРШЕНА.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 15:14:59 +03:00
Maxim Dolgolyov 8d4eab659c feat(geom8): Wave 4 Главы 3 — §8-§9 (биссектриса, отношение площадей подобных)
§8 Свойство биссектрисы треугольника: SVG с слайдерами AB/AC/BC,
автоматическое построение точки D на BC через BD/DC=AB/AC, цветовая
подсветка отрезков BD/DC; 5-шаговое доказательство через параллель
CE∥AD, равнобедренный △ACE и теорему Фалеса; калькулятор BD,DC по
сторонам; DnD верна ли пропорция; тренажёр; босс.

§9 Отношение площадей подобных треугольников: SVG двух подобных
треугольников со слайдерами k=0.5..3 и S₂, live S₁=k²·S₂;
5-шаговое доказательство через S=½·a·h и подстановку отношений;
двухрежимный калькулятор (k,S₂→S₁ или S₁,S₂→k=√(S₁/S₂)); DnD
по k²=4 vs k²=9; mini-quiz из 5 вопросов с обобщением на произвольные
подобные фигуры; тренажёр; босс.

File: 3234 → 4095 LOC. Все 9 §§ Главы 3 готовы.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 15:04:15 +03:00
Maxim Dolgolyov f9f6a04c88 fix(geom8 ch3): аудит §1, §3, §5, §6, §7 — корректная геометрия SVG
§1 Доказательство Фалеса: точки пересечения трёх параллельных секущих
со второй стороной угла были заданы фиксированно (y=65/92/119), но
по геометрии должны вычисляться из наклона второй стороны
(slope=-80/230). Пересчитано во всех 5 шагах + добавлены метки точек,
штрихи равенства параллельных отрезков, корректные подписи A'/B'/C'.
Step 5: вертикальные линии заменены на отрезки между двумя секущими.

§3 Card 3.1: треугольник A'B'C' не был подобен ABC (отношения
сторон 1.59 vs 2.06). Пересчитан как точное масштабирование ABC
с коэффициентом k=2 относительно якоря B. Также фикс баги
'a/a*k/k' (всегда =1) в подписи коэффициента.

§5 Card 5.1: малый треугольник не подобен большому (отношения
1.71/2.03/1.88). Пересчитан с k=2 от якоря B.
Босс задача 1: тоже не подобен — исправлен на k=3.
Step 1 доказательства: тоже исправлен на k=5/3.

§6 Card 6.1: треугольники имели разные углы ∠A (68.6° vs 50.8°)
и непропорциональные стороны. Пересчитано с равными углами в A
и пропорцией k=2.
Босс задача 1: viewBox расширен, координаты исправлены на k=1.5.
Step 1: исправлено на k=2.

§7 Card 7.1: стороны не пропорциональны (2.68/1.68/1.80).
Пересчитано с k=2.5 от якоря B.
Step 1: исправлено на k=2.

Интерактивные слайдеры (§3 k, §5 α/β/k, §6 SAS, §7 SSS) — проверены,
они корректно вычисляют координаты по слайдерам.

Всего: 18 статичных + 5 интерактивных SVG проверено, 12 исправлено.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 14:55:00 +03:00
Maxim Dolgolyov 4803f970c1 feat(geom8): Wave 3 Главы 3 — §6-§7 (второй СУС и третий ССС признаки подобия)
§6 Второй признак (СУС — сторона-угол-сторона): SVG двух треугольников
с 4 слайдерами (AB, AC, угол A, k), второй автомасштабируется через SAS;
5-шаговое доказательство; калькулятор через теорему косинусов; DnD
подобны/не подобны (5 пар); тренажёр; босс.

§7 Третий признак (ССС — три стороны): SVG двух треугольников с 4
слайдерами (a, b, c, k), оба строятся через теорему косинусов с проверкой
неравенства треугольника; 5-шаговое доказательство; калькулятор проверки
пропорциональности 6 сторон; DnD; mini-quiz из 5 вопросов на все 3
признака (УУ, СУС, ССС); тренажёр; босс.

File: 2338 → 3182 LOC. 7 of 9 §§ Главы 3 готовы.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 14:35:06 +03:00
Maxim Dolgolyov ac3aaeadb2 feat(geom8): Wave 2 Главы 3 — §4-§5 (параллельная стороне, первый признак ДД)
§4 Свойство параллельной прямой: SVG-треугольник со слайдером положения
MN (t=0..1), live коэффициент подобия k, подсветка △AMN; 5-шаговое
доказательство через соответственные углы; калькулятор AM,AB,BC→MN+k;
DnD пропорция верна/неверна; тренажёр; босс.

§5 Первый признак подобия (по двум углам): SVG двух треугольников
с 3 слайдерами (α, β, k), оба строятся через теорему синусов с
автоподобием; 5-шаговое доказательство через сумму углов 180° и
вспомогательное построение; DnD подобны/не подобны по углам; калькулятор
2 угла + сторона → соответствующая сторона; тренажёр; босс.

File: 1557 → 2338 LOC.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 14:25:45 +03:00
Maxim Dolgolyov a7c5f10fd4 feat(geom8): Wave 1 Главы 3 — §1-§3 (Фалес, деление m:n, определение подобия)
§1 Теорема Фалеса (обобщённая): SVG-угол со слайдером количества параллелей
2-6 и наклона стороны 10-60°, live пересчёт отношений; 5-шаговое
доказательство; калькулятор пропорций a/b=c/x; DnD; тренажёр; босс.

§2 Деление отрезка в отношении m:n: SVG-построение циркулем-линейкой
со слайдерами m,n=1-6, анимация с лучом и параллельной через Pm;
калькулятор AB,m,n→AC,CB; 4-шаговое доказательство формулы координат;
тренажёр; босс.

§3 Определение подобных треугольников: SVG два треугольника со слайдером
k=0.5-3.0, второй масштабируется коэффициентом подобия, стороны подписаны;
калькулятор a,b,c,k→a',b',c'; DnD подобные/неподобные пары; тренажёр;
mini-quiz из 4 теоретических вопросов; босс.

GLOSSARY: +пропорциональность.
File: 429 → 1557 LOC.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 14:16:20 +03:00
Maxim Dolgolyov 03d567e953 feat(catalog): Геометрия 8 (Казаков) — Phase 0 hub + 4 skeleton
- migration 017: geometry-8 hub + 4 children (Многоугольники, Площади,
  Подобие, Окружности) с parent_slug. sort_order=4, physics-8 → 5.
- geometry_8_hub.html (~380 LOC): blue/cyan hub в стиле algebra-8-hub,
  4 цветные карточки глав (amber/emerald/purple/cyan), агрегированный
  прогресс, ачивка «Мастер геометрии 8» при 56/56.
- 4 skeleton-файла chapter (geometry_8_ch1..ch4.html): полная
  инфраструктура (CSS, STATE, XP-карта, glossary, search Ctrl+K,
  sidebar, DnD, server-sync), 16/15/9/16 параграфов как stub'ы.
  Реальный контент — в последующих волнах.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-27 18:47:40 +03:00