Commit Graph

22 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 7cea060179 fix(geom8 ch4): §12 малая дуга вместо большой + §16 слайдер и калькулятор
§12 Card 12.1, 12.3 (угол между касательной и хордой):
- Дуга AB рисовалась с sweep=1 — это ДЛИННАЯ дуга через левую сторону
  (250°). Но теорема говорит про малую дугу 'внутри угла' между
  касательной и хордой, которая на ПРАВОЙ стороне (~110°).
- Изменено на sweep=0 — теперь рисуется правильная малая дуга
  справа, та самая что 'inside the angle'.

§16 Интерактив 1 'PT² = PA·PB':
- Слайдер угла секущей имел range 5..60° но математически возможен
  только до asin(R/PO)=asin(62/147)≈25°. При угле > 25° секущая
  пролетает мимо окружности (disc<0), SVG не рендерится — пользователь
  видел пустой блок.
- Range изменён на 2..22° (с запасом). Default value 12°. Теперь
  всегда рендерится корректный SVG с касательной + секущей.

§16 Интерактив 3 'Калькулятор':
- В результате 'PT = \u221a(PA\u00b7PB)' писались литеральные
  unicode-escape строки (двойные backslash в template literal
  становятся одиночными в строке, но \u221a не trigger escape
  → литеральная строка '\u221a'). Заменено на настоящие
  символы √ и · в коде.
- Добавлен SVG слева от калькулятора с диаграммой PT²=PA·PB
  (касательная PT, секущая PAB из внешней точки P).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 20:59:44 +03:00
Maxim Dolgolyov e8bd098427 fix(geom8 ch4): §12-§14 — корректная геометрия SVG (касательная, хорды, секущие)
§12 (Угол между касательной и хордой):
- Card 12.1, 12.3: полностью переписаны. Касательная — настоящая
  горизонтальная прямая в точке A на нижнем краю окружности;
  хорда AB к точке B на верхней дуге; маркер угла α радиуса 18
  между направлением касательной и хордой. Подсветка дуги AB
  только обводкой (stroke), без заливки fan-сектора.
- Интерактив 1: добавлен корректный маркер угла, дуга stroke-only.

§13 (Угол между двумя хордами):
- Card 13.1: переписан. 4 точки A,B,C,D через тригонометрию
  (тестовые углы 200°/20°/80°/280°). Хорды AB и CD пересекаются
  в P=(141,96) — настоящее аналитическое пересечение.
  Дуги AC и BD — тонкими толстыми обводками БЕЗ заливок.
- Интерактив 1: подсветки дуг переделаны на stroke-only.

§14 (Угол между секущими из внешней точки):
- Card 14.1: переписан с корректной геометрией секущих. P=(272,92)
  снаружи; обе секущие — настоящие прямые через P; все 4 точки
  пересечения вычислены аналитически (через квадратное уравнение).
- Интерактив 1: добавлен хелпер secantPoints(P, O, R, θ) который
  гарантирует, что точки пересечения лежат на одной прямой с P.
  Заменены произвольные углы на окружности на правильное построение.

Все §12-§14 теперь геометрически точны: касательные действительно
касательны, хорды действительно пересекаются в указанной P, секущие
действительно прямые через внешнюю точку.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 20:52:50 +03:00
Maxim Dolgolyov ac10ebdd21 feat(geom8): Wave 5 — финал Главы 4 (ПОСЛЕДНИЙ параграф Геометрии 8!)
Часть 1: 16 mini-cards со SVG-иконками и формулами в KaTeX
для всех §1-§16 (касательные, дуги, вписанные углы, произведения).

Часть 2: интерактивная карта связей (SVG 620×360):
центральный узел 'ОКРУЖНОСТЬ' → 3 ветви (Касательные §1-7,
Углы §8-14, Отрезки §15-16). Кликабельные узлы с формулами.

Часть 3: 7 интегрированных боссов (по 10 XP):
  Босс 1 (§1+§3): R=5, OP=13 → PT=12, периметр=34
  Босс 2 (§9+§11): диаметр AB, ∠CAB=35° → ∠ACB=90°, ∠ABC=55°
  Босс 3 (§10+§13): хорды, дуги 70°/50° → ∠P=60°, ∠ADC=35°
  Босс 4 (§14): две секущие, дуги 100°/40° → ∠P=30°
  Босс 5 (§15): PA=4 PB=9 PC=6 → PD=6
  Босс 6 (§16): PT=8 AB=12 → PA=4, PB=16
  Босс 7 (§7): R₁=6 R₂=2 d=10 → ℓ=√84≈9.17

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

File: 6712 → 7381 LOC. ГЛАВА 4 ПОЛНОСТЬЮ ЗАВЕРШЕНА.

🎉 ВСЯ ГЕОМЕТРИЯ 8 ЗАВЕРШЕНА:
  Глава 1 (Многоугольники, 16§+финал): 5560 LOC
  Глава 2 (Площади, 15§+финал): 7144 LOC
  Глава 3 (Подобие, 9§+финал): 4709 LOC
  Глава 4 (Окружности, 16§+финал): 7381 LOC

Итого: 56 параграфов + 4 финала = 60 разделов, 24,794 LOC.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 20:33:48 +03:00
Maxim Dolgolyov 9b6a9adaf9 fix(geom8 ch4): аудит §12-§16 — корректные точки на окружности и пересечения хорд
Найдено 6 геометрических SVG-фиксов (LaTeX везде чист):

§13 Card 13.1 (две хорды): точки A,B,C,D были смещены от окружности,
точка P не лежала на обеих хордах. Пересчитаны через
(cx+R·cos θ, cy+R·sin θ) с r=65; P=(126,74) — настоящее пересечение
хорд AB и CD.

§13 Proof: углы 210°/290°/350°/70° давали хорды AC и BD которые
НЕ пересекались внутри окружности. Изменены на 220°/10°/130°/300° —
P=(119,71) внутри.

§14 Card 14.1: точки секущих не лежали на окружности и линии от P
не проходили через обе точки пересечения. Пересчитаны как реальные
пересечения секущих с окружностью при углах ±20°/-10°.

§14 Proof: A,B,C,D построены как окружностные точки без проверки
коллинеарности с P. Заменены на построение через хелпер _sec()
с углами ±15° от P.

§15 Card 15.1: P=(116,87) но хорды пересекались в (114.7,88.1) —
2px разница. P сдвинут на (114,88); концы хорд пересчитаны
точно на окружность r=65.

§16 Card 16.1: T не была настоящей точкой касания (OT⊥PT нарушено).
T пересчитана как настоящая касательная из P через asin(R/|OP|);
добавлен маркер прямого угла; A,B заменены на реальные пересечения
секущей.

KaTeX-эскейпы в §12-§16 проверены — все \angle, \dfrac и т.п.
корректно удвоены. Математика в задачах проверена выборочно — без
ошибок.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 20:15:22 +03:00
Maxim Dolgolyov b400366f06 feat(geom8): Wave 4 Главы 4 — §12-§16 (углы и произведения отрезков в окружности)
§12 Угол между касательной и хордой: slider дуги, live угол=½дуги;
4-шаговое доказательство через диаметр и вписанный угол; калькулятор
двунаправленный; тренажёр; DnD; босс.

§13 Угол между двумя хордами: 2 слайдера дуг, пересечение через
уравнения прямых, live угол=½(дуга₁+дуга₂); 4-шаговое доказательство
через вспомогательный треугольник; калькулятор; тренажёр; DnD; босс.

§14 Угол между секущими из внешней точки: 2 слайдера дуг,
live угол=½|дуга₁−дуга₂|; 4-шаговое доказательство через внешний
угол △PAD; калькулятор; тренажёр; DnD; босс.

§15 Произведение отрезков пересекающихся хорд: SVG-слайдеры
положения и угла, live PA·PB vs PC·PD через квадратное уравнение
пересечения хорд с окружностью; 4-шаговое доказательство через
подобие △APC∼△DPB; калькулятор (3 отрезка → 4-й); тренажёр; DnD; босс.

§16 Квадрат касательной = произведение секущих: slider угла секущей,
касательная с маркером ⊥; live PT²=PA·PB; 4-шаговое доказательство
через подобие △PTA∼△PBT; калькулятор 3-в-1; тренажёр; DnD; босс.

GLOSSARY: +угол между касательной и хордой, +пересекающиеся хорды,
+полусумма дуг, +полуразность дуг, +квадрат касательной.

File: 4642 → 6712 LOC. ВСЕ 16 §§ Главы 4 готовы.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 19:53:57 +03:00
Maxim Dolgolyov cf3ffb4a46 fix(geom8 ch4): §8.1 — маркер угла α на правильном направлении
Маркер центрального угла α был нарисован дугой M 142,81 A 22,22 0 0,1 142,119
— стартовая точка (142,81) находилась в направлении -40° от O (между
OA и горизонталью), что НЕ совпадало с направлением радиуса OA (-60°).
Дуга выглядела не между радиусами а сбоку.

Исправлено: dуга теперь от (131,81) до (131,119) — точки лежат на
радиусах OA и OC на расстоянии 22 от центра (угол -60° и +60°
соответственно). Подпись α тоже подвинута чуть левее.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 19:28:06 +03:00
Maxim Dolgolyov 497a4e92a0 fix(geom8 ch4): §8.1 и §8.3 — переделаны рисунки крупнее и нагляднее
Card 8.1 (центральный угол): viewBox 260×160 → 280×200. Добавлена
заливка сектора (pie slice) пастельно-жёлтого, дуга AC выделена
КРАСНОЙ толстой линией (stroke 3.5), угол α у центра — большая
оранжевая дуга радиуса 22. Точки на окружности с подписями A,C
крупными Unbounded. Подпись '⌣AC = α°' справа от дуги, не
накладывается. Подзаголовок 'центральный угол ∠AOC' в углу.

Card 8.3 (длина дуги): viewBox 260×150 → 280×190. Радиусы теперь
СПЛОШНЫЕ синие (раньше были пунктирные серые — невидимые). Подпись
R на радиусе OA крупная JetBrains Mono. Дуга ℓ выделена красной
толстой линией (4px). Угол α у центра — большая дуга радиуса 28.
Формула 'ℓ = (α/360°)·2πR' внизу как референс.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 19:26:44 +03:00
Maxim Dolgolyov 8b2dca16ad fix(geom8 ch4): доп. LaTeX-эскейпы в §8 §9 §11 (4 локации)
§8 Интерактив 1 slider label: \alpha (был \alpha → 'alpha' в DOM)
§8 Интерактив 4 wg-help: формула длины дуги \ell = \dfrac{\alpha}{360}\cdot 2\pi R
§9 Интерактив 1 slider label: \alpha
§11 Card 11.1 $$...$$ блок: \text, \implies, \angle

Всего 9 команд KaTeX исправлены — теперь рендерятся как формулы,
а не текст 'alpha', 'dfrac' и т.п.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 19:22:32 +03:00
Maxim Dolgolyov 121713b5d8 fix(geom8 ch4): прямые углы в §7 + LaTeX в §8 и §11 slider
§7 Card 7.1 (общая внешняя касательная теория): добавлены 4 правильных
маркера прямого угла (L-формы) во всех 4 точках касания + радиусы
от O₁/O₂ к каждой точке касания.

§7 Card 7.2 (доказательство формулы): переделан рисунок — добавлена
точка K (основание перпендикуляра из O₂ на O₁T₁) с подписью,
правильные L-маркеры в T₁, T₂, K; подписи R₁, R₂, R₁−R₂, d.

§7 Интерактив 1 (live внешняя касательная): добавлены 4 маркера
прямого угла во всех точках касания, вычисляемых через единичные
векторы радиуса и касательной + красные точки на T₃,T₄ + 4 пунктирных
радиуса от центров.

§8 LaTeX: \alpha, \smile, \ell, \dfrac, \cdot, \pi
в card 8.1 (центральный угол) и 8.3 (длина дуги).
§8 Интерактив 1 help: \angle ABC.

§11 Интерактив 1 help: \angle ACB.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 19:18:14 +03:00
Maxim Dolgolyov c36043c80e fix(geom8 ch4): LaTeX-эскейпы в §9, §10, §11 + точка T в §6.2 (внутреннее касание)
LaTeX-баги (в template literals \angle/\dfrac/\smile/\sqrt/\neq
должны быть удвоены):
- §9.1: формула $$\angle ABC = \dfrac{1}{2}\,\angle AOC = ...$$
- §9.2: пункт 1 'центр на стороне угла' с \angle AOC = 2\angle ABC
- §9.3: задача 'центральный = 110°, найти вписанный' — все формулы
- §10.1: формула $$\angle AB_1C = \angle AB_2C = \angle AB_3C = ...$$
- §11.2: доказательство '\smile AB = 180°', '\angle ACB = ½·180° = 90°',
  '\neq A,B'
- §11.3: задача 'диаметр AB=10, AC=6, найти BC' — формула Пифагора
  с \sqrt

§6.2 Признаки касания — внутреннее касание:
Точка T была нарисована в (145,60) — это самый ЛЕВЫЙ край большой
окружности O₁=(185,60) R₁=40, то есть на ПРОТИВОПОЛОЖНОЙ стороне
от меньшей окружности. Правильно: T должна быть в (225,60) — на
правом краю обеих окружностей (185+40 = 200+25 = 225), там где
они действительно касаются. Подпись T тоже сдвинута.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 19:12:55 +03:00
Maxim Dolgolyov dac075b886 fix(geom8 ch4): §8-§11 — точная геометрия SVG + LaTeX в §10.2
§10 Card 10.2 'Доказательство следствия': в KaTeX-формулах
\angle и \dfrac были записаны с одинарным \, поэтому JS
template literal заменял \a на a, и KaTeX рендерил 'angleAB_1C'
и 'dfrac12' как текст. Исправлено на \\angle и \\dfrac.

SVG-фиксы:
- §8.1: дуга начиналась не с вершины A — исправлено.
- §9.1: все три точки A,B,C были вне окружности на 4-7px —
  пересчитаны на окружность r=65.
- §9.2 'случай O на стороне AB': переделана компоновка —
  B наверху, A в нижней антиподе, O на отрезке BA (диаметр),
  C на окружности справа.
- §9 Интерактив 1 (slider): подпись угла AOC вылетала вправо
  из viewBox — выровнена по центру.
- §10.1 и §10.3: точки на окружности 4-7px смещены — пересчитаны.
- §11.1 и §11.3: маркер прямого угла в C был горизонтальной
  скобкой, не связанной с CA/CB. Пересчитан через единичные
  векторы — теперь корректно показывает 90° между катетами.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 19:08:54 +03:00
Maxim Dolgolyov caef49f387 fix(geom8 ch4): §5 Card 5.3 — верхняя сторона угла под 30° (касается обоих кругов)
Было: верхняя сторона угла нарисована до точки (258,56) — это угол
26.66° к горизонтали (half=13.33°). Круги вписаны по формуле
r=d·sin(15°), т.е. ожидался угол 30° (half=15°). Поэтому верхняя
сторона визуально не касалась окружностей — проходила выше.

Стало: верхняя сторона до точки (257,38) — угол ровно 30°
((cos30°,-sin30°)·280 = (242.5,-140)). Биссектриса под 15°.
Оба круга теперь геометрически точно вписаны и касаются обеих
сторон угла.

Добавлены 4 точки касания T₁/T₂/T₃/T₄ с подписями, метки O₁/O₂
сдвинуты чуть-чуть.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 18:59:58 +03:00
Maxim Dolgolyov 892024f6a3 fix(geom8 ch4): §4 — маркеры прямого угла к центру O во всех SVG
Тот же системный фикс что и в §3: маркер прямого угла в точке
касания T должен быть ВНУТРИ треугольника OTA (между T→O и T→A).
Раньше использовалось +u_radius (наружу от центра) — теперь
-u_radius (к центру O).

Затронуты:
- §4 Card 4.1 (задача построения): 2 маркера в T₁, T₂
- §4 Card 4.3 (длина касательной): 1 маркер в T
- §4 Интерактив 1 (пошаговое построение, шаги 4-5): 2 маркера

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 18:52:56 +03:00
Maxim Dolgolyov ca6b93fb57 fix(geom8 ch4): §3 — маркеры прямого угла НА ВНУТРЕННЕЙ стороне касательной (к O)
Маркер прямого угла в точке касания T должен быть на той стороне,
где геометрически находится угол 90° — внутри треугольника OTA,
т.е. между направлениями T→O и T→A.

Раньше использовалось +u_radius (от центра наружу) → маркер
оказывался ВНЕ круга на дальней от A стороне. Изменено на
-u_radius (внутрь, к центру). Теперь маркер показывает угол
90° между OT и tangent правильно.

Затронуты:
- §3 Card 3.1 (статичная)
- §3 Интерактив 1 (slider OA)
- §3 Интерактив 2 (пошаговое доказательство)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 18:50:22 +03:00
Maxim Dolgolyov 1d6f97e636 fix(geom8 ch4): §3 §4 §5 — корректная геометрия SVG и подписи
Проверено 11 SVG в §3, §4, §5 — 11 исправлено.

§3 Касательные из одной точки:
- Card 3.1: пересчитаны точки касания T₁,T₂ по корректной формуле
  T_x=O_x+R²/OA, T_y=O_y±R·AT/OA (раньше координаты были произвольные);
  маркеры прямого угла направлены правильно (CCW perp для верхней,
  CW perp для нижней); все подписи вне линий касательных.
- Интерактив 1 (slider): найден баг — sinA/cosA были перепутаны
  в T_x/T_y. Теперь T₁x=cx+R*sinA, T₁y=cy−R*cosA. Маркер прямого
  угла T₂ исправлен с CCW на CW. ViewBox расширен под широкий OA.
- Интерактив 2 (proof): тот же фикс формулы + маркер прямого угла.

§4 Построение касательной:
- Card 4.1 (построение): пересчитаны точки касания T₁,T₂ как
  пересечение исходной окружности O(90,100,r=50) и вспомогательной
  M(165,100,r=75) — раньше точки были вне окружности.
- Card 4.3 (формула): точка касания T была на (107,56) — вне
  окружности. Пересчитана на T=(89,59) с правильным маркером.
- Интерактив 1 (шаги): то же исправление формулы и направлений
  маркеров прямого угла.
- Интерактив 2 (live): сlider tangent positions через радиальные
  unit-векторы для подписей вне линий.

§5 Окружности в углу:
- Card 5.1: центр окружности был на O(135,145) — не на биссектрисе
  и не равноудалён от сторон. Пересчитан на O(157,148) с r=35
  по формуле от вершины угла. T₁,T₂ — проекции центра на стороны.
  Добавлены маркеры прямого угла в обеих точках касания.
- Card 5.3: две окружности на биссектрисе с r=d·sin(α/2).
- Интерактив 1 (slider): добавлен маркер прямого угла в T₂
  (отсутствовал); направление T₁-маркера исправлено.
- Интерактив 2 (proof): то же.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 18:45:22 +03:00
Maxim Dolgolyov 2a6c214cd5 feat(geom8): Wave 3 Главы 4 — §8-§11 (центральный/вписанный углы)
§8 Центральный/вписанный углы. Дуга: slider центрального угла α от
0 до 360° с подсветкой дуги; SVG с вписанным углом и его позицией;
DnD центральный/вписанный/ни тот ни другой; калькулятор длины дуги
ℓ=α/360·2πR; тренажёр; босс.

§9 Свойство вписанного угла: dual slider центральный α + вписанный
β=α/2 на одной дуге; 5-шаговое доказательство для случая O на стороне
вписанного угла через равнобедренный △ и внешний угол; двунаправленный
калькулятор; DnD верно/неверно; тренажёр; босс.

§10 Вписанные углы на одну дугу: SVG с дугой AC и 3 вершинами
B₁,B₂,B₃ на другой части — все углы AB_iC равны; 3-шаговое
доказательство через половину центрального; калькулятор; DnD; тренажёр;
босс.

§11 Вписанный угол на диаметр: slider позиции C — угол ACB всегда
90°, прямоугольный треугольник вписан с гипотенузой = диаметр;
4-шаговое доказательство; калькулятор через Пифагор (диаметр+катет
→ другой катет); тренажёр; DnD; босс.

File: 3060 → 4549 LOC. 11 of 16 §§ Главы 4.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 18:19:26 +03:00
Maxim Dolgolyov 0bcb9e5f2e fix(geom8 ch4): §3 — подписи T₁/T₂/AT уходят с касательных, §2.1 — убран лишний cx/cy
§3 Интерактив 1 'Две касательные из внешней точки': подписи T₁ и T₂
теперь располагаются по радиальному направлению (наружу от центра)
с большим отступом, не лежат на касательной линии. Подписи длин
AT₁ и AT₂ вынесены ПЕРПЕНДИКУЛЯРНО касательным наружу (через
вычисление нормали к каждой касательной). Все подписи теперь
крупнее (font 13, Unbounded для вершин, JetBrains Mono для длин)
и читаются без наложения на линии.

§3 Интерактив 2 'Доказательство касательных по шагам': те же фиксы
плюс расширен viewBox 260×200 → 280×220 для размещения подписей.

§2 Card 2.1: убран лишний атрибут cx='100' cy='95' на <line> элементе
радиуса (line не имеет атрибутов cx/cy — игнорировалось браузером,
но загромождало код).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 18:00:32 +03:00
Maxim Dolgolyov cc7551755b feat(geom8): Wave 2 Главы 4 — §4-§7 (построение касательной, вписанные в угол, расположение окружностей, общая касательная)
§4 Построение касательной: пошаговое SVG-построение (6 шагов через
вспомогательную окружность с диаметром OA), live-слайдеры R и |OA|,
калькулятор AT=√(OA²−R²), DnD шагов построения, тренажёр, босс.

§5 Окружности вписанные в угол: слайдеры d и угол 2α — окружность
всегда касается обеих сторон, биссектриса проходит через центр;
5-шаговое доказательство; калькулятор r=d·sin(α/2); DnD утверждений;
тренажёр; босс.

§6 Взаимное расположение двух окружностей: 3 слайдера R1, R2, d с
живым определением одного из 5 случаев (внешние/касание внешнее/
пересекаются/касание внутреннее/внутренние); DnD-сортер 8 карточек
по 4 категориям; калькулятор; тренажёр; босс.

§7 Длина общей касательной: SVG внешней касательной с формулой
ℓ=√(d²−(R₁−R₂)²) + SVG внутренней касательной с ℓ=√(d²−(R₁+R₂)²);
4-шаговое доказательство через прямоугольник KT₁T₂O₂; калькулятор
обеих формул; тренажёр; босс.

File: 1638 → 3042 LOC. 7 of 16 §§ Главы 4 готовы.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 17:17:57 +03:00
Maxim Dolgolyov 17e42990ad feat(geom8): Wave 1 Главы 4 — §1-§3 (касательная)
§1 Касательная. Признак: слайдер d от 0 до 2R — секущая/касательная/не
пересекает с цветовым индикатором; 5-шаговое доказательство через
прямоугольный △OTM; калькулятор вида прямой; DnD по 3 корзинам;
тренажёр; босс.

§2 Свойство касательной: слайдер угла T — касательная ⊥ радиус OT всегда,
маркер 90° следует за T; 5-шаговое доказательство от противного;
калькулятор AT=√(|OA|²−R²); тренажёр; DnD утверждения; босс.

§3 Касательные из одной точки: слайдер |OA| — две касательные из A,
AT₁=AT₂ с тиками равенства; 5-шаговое доказательство через равенство
прямоугольных △OAT₁ и △OAT₂; калькулятор |AT|; тренажёр; DnD; босс.

GLOSSARY: +точка касания, +радиус.
File: 470 → 1549 LOC.

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