Drag-фикс (12 интерактивов):
Корневая причина — el.setPointerCapture(ev.pointerId) вызывался при
pointerdown, потом redraw() заменял innerHTML, удаляя элемент
с захваченным pointer. На touch-устройствах поток событий терялся.
Применено ко всем drag-обработчикам §1, §4, §5, §8, §9, §10, §11,
§12, §13, §14, §15, §16:
- Удалён setPointerCapture (бесполезен после innerHTML replace)
- Добавлен ev.preventDefault() после проверки кнопки
- Добавлен e.preventDefault() в начале onMove
- window.addEventListener('pointermove', onMove, {passive: false})
- Флаг active для защиты от stale events
§7 «Живой прямоугольник — равенство диагоналей» — полностью переписан:
- A фикс, C draggable (13px hit area, cursor:grab)
- Прямоугольник всегда axis-aligned
- Обе диагонали dashed разного цвета (зелёная AC, янтарная BD)
- Двойные риски равенства на каждой диагонали
- Подписи длин у каждой диагонали в реал-тайме
- Хелпер sqMark() рисует правильные L-маркеры прямого угла во всех
4 углах прямоугольника, направленные внутрь
- Info-панель: AB, BC, периметр, площадь + постоянно зелёная карточка
'Диагонали AC = BD' с обоими значениями
§16 Интерактив 3 'Доказательство признака 1 пошагово' — переписан:
5 шагов с чёткими SVG-состояниями: Дано → опустить высоты DH₁,CH₂ →
равные углы при основании + равные высоты → конгруэнтность по
'угол-катет' → вывод AD=BC. Подсветки треугольников, штрихи равных
сторон, маркеры прямого угла у оснований высот.
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>
§7 Прямоугольник:
- Card 7.1 (теория): 4 path-маркера которые тянулись ПО кромке
прямоугольника заменены на правильные polyline L-формы (9px),
направленные строго внутрь.
- Card 7.2 (свойство диагоналей): не было ни одного маркера прямого
угла — добавлены 4 на всех вершинах.
- Интерактив 1 «Живой прямоугольник»: маркеры стояли только в 2 углах
через <rect> которые частично выходили за прямоугольник. Заменены
на 4 правильных polyline вычисляемых из Math.min/max границ —
работают при любом направлении перетаскивания вершины B.
§10 Квадрат:
- Card 10.1 (определение): 4 path-маркера трассировавшие по кромке
заменены на правильные L-формы.
- Card 10.2 (свойства): то же.
- Card 10.3 (формулы): добавлены маркеры на все 3 квадрата (6-7px,
в цвет каждого квадрата).
- Интерактив 1 (слайдер): один <rect>-маркер в углу A заменён на
4 правильных polyline-маркера на всех вершинах ABCD, пересчёт
по каждому изменению слайдера.
Геометрия маркера: для угла V с направлениями u,w внутрь —
polyline V+9u → V+9u+9w → V+9w. Маркер всегда внутри фигуры,
оба сегмента перпендикулярны кромкам.
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>
Системный аудит 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>
Было: продолжение рисовалось от next-vertex назад через v, дуга центрировалась
у next-vertex с углом из произвольного направления — углы отображались
неправильно (не у тех вершин, не в тех направлениях).
Стало: для каждой вершины v вычисляются prev/next, направления u=(v-prev)/|·|
(входящая сторона), w=(next-v)/|·| (исходящая). Продолжение u рисуется от v
дальше. Дуга — сектор у v от u-направления до w-направления, sweep
определяется через знак векторного произведения (u×w). Подпись угла —
по биссектрисе дуги на радиусе Rlabel.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Drag (12 SVG-интерактивов): pointermove/pointerup/pointercancel слушались на
самом vertex-элементе. При выходе курсора за пределы маленького круга drag
обрывался — отсюда эффект 'нажал, чуть-чуть потянулось, и всё'. Перенесены
на window — теперь работают как нативный drag.
§7 (Прямоугольник): info-карточка показывала 'AC = BD' с одним значением.
Теперь две отдельные карточки AC и BD + индикатор равенства (зелёная плашка
'Диагонали равны' / красная 'Не равны' с Δ).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
В функции drawProof пошагового доказательства §4 использовалась переменная
cy без определения (была только cx). Это приводило к ReferenceError при
вызове buildP4, и из-за throw в ensureBuilt секция §4 не открывалась
при клике на карточку в селекторе параграфов.
Проверено: все 17 параграфов главы (p1-p16, final1) теперь строятся без ошибок.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Часть 1: 9 mini-cards с формулами всех 16 параграфов (KaTeX).
Часть 2: интерактивная SVG-карта иерархии четырёхугольников
(клик по узлу — подсветка свойств).
Часть 3: 7 интегрированных боссов (по 10 XP):
- Босс 1: многоугольник из суммы углов 1620°
- Босс 2: параллелограмм через треугольник ABD
- Босс 3: средние линии прямоугольника → ромб
- Босс 4: ромб 60° → диагонали (Пифагор)
- Босс 5: теорема Фалеса, 3 подзадачи
- Босс 6: треугольник 12-16-20 — средняя линия + медиана + центроид
- Босс 7: равнобедренная трапеция 20/8/10
Часть 4: при победе над всеми — achievement 'Мастер многоугольников Главы 1',
+50 XP бонус, confetti, кнопка перехода к Главе 2.
File: 5194 → 5558 LOC. Глава 1 полностью наполнена.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>