Commit Graph

6 Commits

Author SHA1 Message Date
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 92a698e307 fix(alg9+geom9): экранирование KaTeX-команд в JS template literals 2026-05-29 10:46:32 +03:00
Maxim Dolgolyov d0cfff38c1 feat(alg9 ch3 final): Финал Главы 3 (5 боссов + ачивка) 2026-05-29 08:45:17 +03:00
Maxim Dolgolyov 8ecb8409eb feat(alg9 ch3 wave2): §12 «Окружность» + §13 «Метод интервалов»
§12 «Длина отрезка. Уравнение окружности»:
  - 3 теорет. карточки (формула расстояния, уравнение окружности, особые случаи).
  - IV1 «Окружность-конструктор»: 3 слайдера a/b/R, SVG-окружность + центр + радиус-линия + динамическое уравнение.
  - IV2 «Калькулятор расстояния»: 4 input + пошаговый разбор + мини-SVG с отрезком AB.
  - IV3 «Точка на окружности?»: 6 квикфайр-задач (да/нет).
  - IV4 «Тренажёр радиуса/центра/длины»: 6 задач на ввод числа.

§13 «Дробно-рациональные неравенства. Метод интервалов»:
  - 3 теорет. карточки (метод интервалов, правило знаков, пример).
  - IV1 «Числовая прямая знаков»: 5 неравенств, SVG-прямая с точками (закрашенными/выколотыми) и цветными знаками интервалов.
  - IV2 «Закрашена или выколота?»: DnD-сортер 6 карточек по 2 категориям.
  - IV3 «Сколько целых решений в [-5;5]»: 6 задач.
  - IV4 «Сумма концов интервалов»: 6 задач на ввод числа.

Добавлены setupSorter() + DnD CSS (.dnd-pool/.dnd-chip/.drop-box/.drop-items).
2026-05-29 08:42:33 +03:00
Maxim Dolgolyov 41f6561357 feat(alg9 ch3 wave1): §10 «Дробно-рац. уравнения» + §11 «Системы нелинейных» + axes2D 2026-05-29 08:35:44 +03:00
Maxim Dolgolyov a07e631e8e feat(alg9 phase0): skeleton + миграция учебника Алгебра 9
- 020_algebra_9_hub.sql: hub (slug 'algebra-9', indigo, 19 параграфов) + 4 главы
- algebra_9_hub.html: страница каталога с индиго-палитрой
- algebra_9_ch1..ch4.html: skeleton-страницы 4 глав
  * Глава 1 (amber): §1-§5 Рациональные выражения
  * Глава 2 (emerald): §6-§9 Функции
  * Глава 3 (violet): §10-§13 Дробно-рациональные уравнения и неравенства
  * Глава 4 (cyan): §14-§19 Прогрессии
- Все skeleton-файлы рабочие: переключение параграфов, theme toggle,
  search modal, sidebar, progress, XP. Stub-плейсхолдеры в buildPx().
- Наполнение параграфов запланировано на Phase 1+.
2026-05-29 07:56:14 +03:00