Commit Graph

17 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 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 e0e3280404 fix(geom8 ch2): §12 равносторонний крупнее + §14 тип треугольника крупнее + §11 доказательство Пифагора корректное + §15 таблица троек красивее
§12 Равносторонний — слайдер a: viewBox 300×260 → 420×320, scale 10 → 14;
треугольник теперь занимает большую часть SVG. Добавлены точки и крупные
буквы вершин (Unbounded), цветовые подписи h и S в SVG.

§14 Тяни стороны — тип треугольника: viewBox 320×240 → 440×320, переписана
функция drawTriSVG: всегда использует наибольшую сторону как основание
(стабильная компоновка), масштаб подгоняется под доступную площадь.
Крупные подписи вершин с точками, форматированные подписи сторон.

§11 Доказательство квадрат (a+b)²: 2-й, 3-й и 4-й треугольники имели
оба катета одинаковой длины (=a вместо a и b). Полностью переписана
геометрия:
  - T1 (top-left): legs a (вертикаль) и b (горизонталь)
  - T2 (top-right): legs a (горизонталь) и b (вертикаль)
  - T3, T4: повторение поворотом 90°
  - Внутренний квадрат (off,off+a)-(off+b,off)-(off+S,off+b)-(off+a,off+S)
    с реально равными сторонами c=√(a²+b²)
Каждый треугольник — своего цвета. Шаги переработаны: 1) большой квадрат
с (a+b)², 2) 4 треугольника, 3) внутренний квадрат c², 4) уравнение
площадей, 5) вывод c²=a²+b². ViewBox 360×240 → 440×380.

§15 10 троек Пифагора: каждая тройка теперь в виде карточки с фоном
(зелёный для примитивных, оранжевый для кратных), бейджем 'ПРИМ' / '×k',
мини-SVG треугольником, формулой a²+b²=c² и hover-анимацией. Подобранные
тройки: 6 примитивных (3-4-5, 5-12-13, 7-24-25, 8-15-17, 9-40-41,
20-21-29, 11-60-61, 12-35-37) + 2 кратные (6,8,10) и (10,24,26).
Большая детальная SVG с подписями + 'a²+b²=c²' в численном виде.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 14:41:24 +03:00
Maxim Dolgolyov 4b160a46e8 fix(geom8 ch2): аудит §9-§15 + финал — 5 косяков
§9 Босс 2: в условии было h=12 см, но правильный ответ S=10
требует h=8 см. Подправлены число в условии и подсказка.

§11 Теорема Пифагора:
- Card 11.1: 'квадраты на сторонах' были нарисованы как тонкие
  прямоугольники (140×20 и 20×100). Заменены на настоящие квадраты
  80×80 (a²) и 60×60 (b²). ViewBox увеличен до 200×255.
- Интерактив 1 (слайдер катетов): sqAh=min(40,ax*0.4) и sqBw=min(40,bx*0.4)
  давали прямоугольники, не квадраты. Теперь квадраты ax×ax и bx×bx
  с динамическим viewBox.

§12 Босс 3: в объекте задачи ans=144, но проверка использовала
correct[2]=62 — противоречие. Исправлено ans=62 + чистая подсказка.

Final2 Босс 1: маркер прямого угла в основании высоты H был
ориентирован неправильно (вертикально вниз). Пересчитан через
единичные векторы вдоль BC и перпендикуляра.

Всего проверено 21 SVG, исправлено 5. Остальные §10, §13, §14, §15 — OK.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 13:48:57 +03:00
Maxim Dolgolyov 1d39a1c7ea feat(geom8): Wave 5 — финал Главы 2 (шпаргалка, карта связей, 7 боссов)
Часть 1 — Итоговая шпаргалка: 15 mini-cards с SVG-иконкой и формулой
в KaTeX для каждого § (от S=a² до пифагоровых троек).

Часть 2 — Карта связей (интерактивная SVG 620×340):
кликабельные узлы 'Площадь' → 'Прямоуг. фигуры' / 'Параллелограммы' /
'Треугольники' → конкретные фигуры. Клик показывает формулу площади.

Часть 3 — 7 боссов (по 10 XP):
  Босс 1: прямоугольный 9-12 → c=15, h_c=7.2, S=54
  Босс 2: параллелограмм 14×8 с углом 30° → h=4, S=56
  Босс 3: трапеция 18/12/5 → m=15, S=75
  Босс 4: ромб d₁=16 d₂=12 → S=96, a=10, P=40
  Босс 5: медиана и центроид (S=36) → S/6=6, S/2=18
  Босс 6: равносторонний a=10 → h, S, расстояние от центроида
  Босс 7: пифагорова тройка 5-12-13 (P=30, c=13) → катеты, S=30

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

File: 6519 → 7133 LOC. ГЛАВА 2 ПОЛНОСТЬЮ ЗАВЕРШЕНА.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 13:40:25 +03:00
Maxim Dolgolyov e424bc231c feat(geom8): Wave 4 Главы 2 — §12-§15 (равносторонний, диагональ квадрата, обратная Пифагора, тройки)
§12 Равносторонний треугольник: слайдер a=1..20, live h=a√3/2 и S=a²√3/4,
4-шаговый вывод формулы высоты через Пифагор, калькулятор, тренажёр,
DnD-сортер, босс.

§13 Диагональ квадрата: слайдер a=1..20, live d=a√2, S=a², P=4a,
3-шаговый вывод d=a√2 через Пифагор, калькулятор (a→d/S/P; d→a; S→a/d),
тренажёр, босс.

§14 Обратная теорема Пифагора: 3 слайдера сторон a/b/c, live определение
типа (прямоугольный/остроугольный/тупоугольный) через сравнение c² и a²+b²,
квиз 8 наборов, DnD-сортер, тренажёр, босс.

§15 Пифагоровы тройки: генератор Евклида (m,n → (m²-n², 2mn, m²+n²)),
кликабельная таблица 10 примитивных троек с мини-SVG, тренажёр на поиск
недостающего элемента, квиз 'тройка или нет', DnD примитивные/кратные, босс.

File: 5118 → 6519 LOC. Все 15 §§ Главы 2 готовы.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 13:25:09 +03:00
Maxim Dolgolyov aa4c219d5a feat(geom8): Wave 3 Главы 2 — §9-§11 (общая высота, медианы, Пифагор)
§9 Треугольники с общей высотой: SVG draggable с общей стороной AB и
двумя вершинами C/D на параллельной прямой, live S₁/S₂=a₁/a₂,
анимация-доказательство, калькулятор, тренажёр, босс.

§10 Медиана и площади: SVG draggable треугольник с медианой AM делит
на 2 равновеликих, отдельная визуализация всех 3 медиан → 6 равновеликих
треугольников с центроидом G, доказательство, калькулятор, тренажёр, босс.

§11 Теорема Пифагора (ключевая): слайдеры катетов с квадратами a², b², c²
на сторонах, анимация доказательства через квадрат (a+b)², калькулятор
(a,b→c; c,a→b; диагональ прямоугольника), DnD-сортировщик пифагоровых
троек (3-4-5, 5-12-13, 6-8-10, 7-24-25, 9-12-15), тренажёр, босс (5 задач).

File: 3998 → 5118 LOC. 11 of 15 §§ Главы 2 готовы.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 13:03:49 +03:00
Maxim Dolgolyov e2fc78d1f1 fix(geom8 ch2): §5 высота/доказательство + §8 прямые углы
§5 Draggable трапеция:
- Высота теперь рисуется как вертикальная пунктирная линия В СЕРЕДИНЕ
  трапеции от верхнего основания до нижнего (с прямым углом у основания),
  а не уходит вертикально вверх от вершины A вне фигуры
- Жёлтый drag-handle для h перенесён в вершину D (верх-лево) — тащишь
  её вертикально и высота меняется. Синий drag-handle для b остался в C.
- Добавлены подписи всех вершин ABCD точками и Unbounded-буквами
- Подсказки в углу SVG что какой цвет означает

§5 Пошаговое доказательство:
- Полностью переписана геометрия с КОРРЕКТНЫМ поворотом на 180°
  вокруг середины M боковой стороны BC (формула P'=2M-P)
- Раньше копия трапеции уходила за пределы viewBox (y=-20)
- Теперь 4 шага: трапеция → поворот вокруг M → параллелограмм ABD'A' →
  половина = трапеция, формула S=½(a+b)h

§8 Прямые углы:
- Card 8.1: треугольник A(20,150) B(220,150) C(92,54) — НАСТОЯЩИЙ
  прямоугольный 3-4-5 с h_c=ab/c (раньше координаты не давали 90° в C)
- Card 8.2: оба треугольника теперь корректные прямоугольные с прямыми
  углами на правильных вершинах
- Card 8.3: треугольник 6-8-10, маркер прямого угла в H пересчитан
  через единичные векторы H→C и H→A (раньше показывал не то направление)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 10:13:52 +03:00
Maxim Dolgolyov 8dee3e9829 fix(geom8): SVG audit — Ch1 §10 квадрат и Ch2 §2 прямоугольник
Системный аудит 62 статических SVG в теоретических карточках выявил
2 мелких косяка:

Ch1 §10 (квадрат, карточка 10.2): не хватало прямоугольных меток в
двух верхних углах — у квадрата были обозначены только нижние.
Добавлены маркеры в (68,24) и (168,24).

Ch2 §2 (прямоугольник, карточка 2.2 — периметр): на верхней стороне
у стрелки была ссылка marker-end='url(#a2)', но сам marker #a2 в SVG
не определён → битая ссылка. Убрана для консистентности с остальными
тремя сторонами.

KaTeX-форматирование: проверено во всех 24 buildP-функциях обеих глав —
везде используются корректные $...$ / $$...$$ / \[...\] делиметры.
Конвертаций не потребовалось.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 10:06:50 +03:00
Maxim Dolgolyov faf0fc5b41 fix(geom8 ch2): §5 трапеция — высота между основаниями + правильные диагональ/треугольники
Было:
- 5.1: высота нарисована из вершины (некорректно как иллюстрация
  'расстояние между параллельными сторонами')
- 5.2: координаты треугольников ABD/BCD и диагонали указывали на точки
  ВНЕ трапеции (диагональ заканчивалась в (215,30) вместо вершины D=(65,30))
- 5.3: то же — высота из вершины

Стало:
- Высота — вертикальная пунктирная линия в середине трапеции от верхнего
  основания до нижнего, с прямым углом
- Все вершины ABCD подписаны и отмечены точками
- В 5.2 диагональ BD корректно проведена, треугольники ABD/BCD точно
  совпадают с половинами трапеции, добавлены подписи S₁=½ah, S₂=½bh

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 10:00:21 +03:00
Maxim Dolgolyov 6d7eafceb5 feat(textbook): complete visual enhancement of geometry_8_ch2 §1-§8
- Added inline SVG diagrams to §7 boss tasks (right triangle shapes)
- Added SVG visualizations to §8 theory cards 8.1, 8.2, 8.3 (h_c to hypotenuse)
- Added SVG diagrams to §8 trainer tasks 1, 2, 3, 5 (triangle with altitude)
- Added SVG diagrams to §8 boss tasks 1, 3, 4
- Added mini-interactive СЛАЙДЕР widgets to §2-§8 (one per section):
  §2: rectangle a×b slider, §3: parallelogram a×h slider
  §4: triangle a×h/2 slider, §5: trapezoid (a+b)/2×h slider
  §6: rhombus d₁×d₂/2 slider, §7: right triangle ab/2 slider
  §8: h_c=ab/c slider showing altitude to hypotenuse
- Each slider is IIFE-encapsulated ~40 LOC, live SVG updates on input
- §1 already had slider (ИНТЕРАКТИВ 1 grid); §2-§8 get new СЛАЙДЕР widget
- Fixed duplicate x= attribute in §8.2 SVG proof diagram
2026-05-28 09:56:34 +03:00
Maxim Dolgolyov cb1559439c feat(geom8): Wave 2 Главы 2 — §5-§8 (трапеция, ромб, прямоуг.тр-к, высота к гипотенузе)
§5 Трапеция: draggable SVG (b, h), 4-шаговое доказательство через 2 трапеции
→ параллелограмм, калькулятор 3 режима, DnD, тренажёр, босс.
§6 Ромб: draggable концов диагоналей (AC⊥BD), доказательство 4 тр-ка
→ прямоугольник d₁×d₂/2, тройной калькулятор (диагонали/a·h/a²sinα), DnD,
тренажёр, босс.
§7 Прямоугольный треугольник: draggable катетов, доказательство дублированием
→ прямоугольник, калькулятор (a,b→S,c; S,a→b; c,h_c→S), тренажёр, босс.
§8 Высота к гипотенузе: 3 подобных треугольника подсвечены цветом,
доказательство h_c=ab/c через равенство площадей, калькулятор полный
(a,b→c,h_c,a_c,b_c), DnD, тренажёр, босс.

File: 1675 → 3167 LOC.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 09:30:47 +03:00
Maxim Dolgolyov d20f0f933e feat(geom8): Wave 1 Главы 2 — §1-§4 (квадрат, прямоугольник, параллелограмм, треугольник)
§1 Площадь квадрата: SVG-сетка со слайдером a=1..10, калькулятор двусторонний
(a→S, S→√S), конвертер единиц (мм²/см²/дм²/м²/км²), тренажёр, босс.
§2 Прямоугольник: draggable угол (a,b,S=a·b в реалтайме), калькулятор прямой
и обратный, DnD-сортер по S=24, тренажёр, босс.
§3 Параллелограмм: draggable верхнее основание — S=a·h не меняется
(равноплощадные!), 4-шаговая анимация 'разрезаем и переставляем
в прямоугольник', калькулятор, тренажёр, босс.
§4 Треугольник: draggable C по горизонтальной прямой — S=½·a·h постоянна,
анимация 'достраиваем поворотом на 180° в параллелограмм', калькулятор тройной
(a,h→S; S,a→h; S,h→a), тренажёр, босс.

File: 503 → 1675 LOC.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 09:08:28 +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