На десктопе (>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.
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>
В сообщениях 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>
Баг: у элементов .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>
В концах доказательств использовался 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>
§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>
§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>
§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>
§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>
Системный аудит 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>
Было:
- 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>