Материал учебников теперь полностью наш (LearnSpace), оригинальные
авторы (Арефьева, Латотин, Казаков и др.) убраны из:
- поля textbooks.author в БД (миграция 029);
- footer'ов hub-файлов (9 файлов).
Содержание теории и интерактивов не затронуто.
§7 Перпендикулярность прямой и плоскости:
- SVG определения: плоскость α + вертикальная l + 4 прямые в α с маркерами 90°
- SVG признака: l + m + n пересекающиеся в O, прямые углы
- 6 теоретических карточек (определение, признак, свойства, параллельность+⊥, существование, куб)
- 3 тренажёра: перпендикулярна ли (6), применение признака (5), ⊥ в кубе (5)
- Босс §7: 5 этапов, +70 XP
§8 Расстояния:
- 4 случая side-by-side (точка→плоскость / прямая∥плоскость / парал. плоскости / скрещ. прямые)
- Детальный SVG: точка A над плоскостью + перпендикуляр AO + наклонная AB
- 6 теоретических карточек
- 3 тренажёра: расстояния в кубе (6, с поддержкой √2 / sqrt(2) / корень), какой тип задачи (5), верно/неверно (5)
- Босс §8: 5 этапов, +70 XP
- normalizeAns: общая утилита для ввода √2, sqrt(2), корень2, 1.41, 1.414
§9, §10, Финал — stub до W6/W7.
Shop items of type 'frame' now render a real avatar-sized preview with
the frame's CSS applied (instead of a generic lucide icon) so buyers
see exactly what they're paying for. Title items get a tag-shaped
preview in their color. The avatar-frames section above the shop also
shows the user's actual avatar inside the frame circles, not 'LS' text.
Sidebar nav-avatar now:
• renders the uploaded avatar_url instead of always showing initials
(LS.initPage + new LS.refreshNavAvatar helper)
• picks up frame CSS on every page via applyCosmetics — previously
only dashboard.html applied it
• repaints immediately after picking/deleting an avatar preset
(avPickPreset / avDelete now call LS.setUser + LS.refreshNavAvatar)
Backend getMyActive resolves avatar_frame to {id, css} for both
gamification frames ('fire', 'crown', ...) and shop-purchased frames
('shop_<id>'), so the client doesn't need a second round-trip to
look up the CSS.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
§4 Прямые в пространстве:
- 3 случая side-by-side (пересек./парал./скрещ.)
- Куб с 3 типами пар рёбер подсвечены тремя цветами
- 6 теоретических карточек (определения, признак скрещ., теорема о парал., угол, расстояние)
- 3 тренажёра: тип пары (7), угол между прямыми (5), верно/неверно (5)
- Босс §4: 5 этапов, +65 XP
§5 Прямая и плоскость:
- 3 случая (a⊂α / a∩α=M / a∥α)
- Признак параллельности прямой и плоскости (SVG)
- 4 теоретические карточки
- 3 тренажёра: какой случай (6), применение признака (5), параллельность в кубе (5)
- Босс §5: 5 этапов, +65 XP
§6 Две плоскости:
- 2 случая (пересекаются по прямой / параллельны)
- Признак параллельности плоскостей через 2 пересек. прямые
- 4 теоретические карточки
- 3 тренажёра: расположение (5), достаточно ли условий (5), свойства (5)
- Босс §6: 5 этапов, +65 XP
Финал R2 — stub до W4 (4 босса + ачивка stereo10_r2_master).
Practice (random) now picks tasks by ascending difficulty so the first
slot is always level 1 and the session ramps up. Adds ?exclude= to drop
specific subtopics from the random pool, with a per-section checkbox
modal in the UI.
Each task carries a topic_ref (textbook chapter + paragraph) shown as
a 'Учить тему · §N' button next to the solution, deep-linking to the
right section of /textbook/<slug>. Mapping seeded for all 15 math9
subtopics in migration 028.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
§3 Построения сечений:
- Hero: куб с шестиугольным сечением через M, N, P (4-шаговая анимация: точки → 2 ребра → 6 точек → заливка)
- 3 типа сечений куба: треугольник / прямоугольник / правильный шестиугольник
- Метод следов: куб с M, N, K и следом плоскости сечения на основании
- 4 теоретические карточки (определение, метод следов, параллельные сечения, max сторон)
- 3 тренажёра: тип многоугольника (6), max сторон (5), метод следов (5)
- Босс §3: 5 этапов, +70 XP
Финал раздела 1 (4 босса):
- Босс 1 Элементы тел (4 этапа, +35 XP)
- Босс 2 Аксиомы (4 этапа, +35 XP)
- Босс 3 Сечения (4 этапа, +35 XP)
- Босс 4 Сборная (5 этапов, +45 XP)
- Celebration: ачивка stereo10_r1_master + 100 XP бонус
- Прогресс хранится в STATE.bosses{f1..f4} + geometry10_achievements в localStorage
- backend/uploads/avatars/preset_01..27.png — иллюстрированные персонажи
- POST /api/avatar/preset — мгновенная установка без модерации
- GET /api/avatar/presets — список доступных пресетов
- profile.html: галерея пресетов в модалке аватара, доступна студенту/учителю/админу
- кастомная загрузка с модерацией остаётся только для студентов
Кнопка «Рисовать» в тулбаре учебника — переиспользует существующий
annotate-режим доски (так же, как для симуляций). Переключатель учителя
транслируется студентам через тот же SSE-канал /sim/annotate. При
закрытии учебника annotate-режим автоматически выключается.
Реализована вся глава 2 (был stub, теперь полноценный SPA):
violet тема (#7c3aed → #c4b5fd), 5 § + Финал.
§13 Корень n-й степени из числа a:
- SVG графиков y = x^n для n=2,3,4,5 на отрезке [-2.5; 2.5]
с линией y=4 показывающей различие чётных/нечётных n
- Таблица существования (чётное/нечётное n vs знак a)
- Уравнение x^n = a и число корней
- Интерактив 1: 'существует ли?' (6 да/нет)
- Интерактив 2: 'найди значение корня' (8 вычислений)
- Интерактив 3: 'сколько корней x^n = a' (6 заданий)
- Босс §13: 5 этапов
§14 Свойства корней n-й степени:
- HTML+KaTeX плакат '5 основных свойств' (произв., частное,
степень, сокращение, корень из корня)
- Подсветка важности: ⁿ√(a^n) = |a| для чётных, = a для нечётных
- Интерактив 1: вычисли через свойства (8 заданий)
- Интерактив 2: ⁿ√(a^n) с модулем (6 заданий)
- Босс §14: 5 этапов
§15 Применение свойств для преобразований:
- 4 алгоритма: вынесение, внесение, рационализация, сравнение
- Спойлер с сопряжёнными выражениями (a+b)(a-b)
- Интерактив 1: вынеси множитель (6 заданий)
- Интерактив 2: внеси множитель (5 заданий)
- Интерактив 3: рационализация (5 заданий)
- Босс §15: 5 этапов
§16 Функция y = ⁿ√x:
- 2 SVG графика (300x260 каждый): чётные n (²√x, ⁴√x, ⁶√x)
только для x≥0 + нечётные n (³√x, ⁵√x, ⁷√x) на всей оси
- Полная сравнительная таблица свойств D, E, монотонность,
чётность, нули для двух случаев
- Закономерности (точка (1,1), (-1,-1) для нечётных)
- Интерактив 1: сравни корни (6 заданий < / = / >)
- Интерактив 2: свойства функции (5 заданий)
- Босс §16: 5 этапов
§17 Иррациональные уравнения:
- Метод возведения в степень + объяснение посторонних корней
- Пример с подвохом: 2 корня после возведения, 1 истинный
- Эквивалентная система √f = g ⇔ {f = g², g ≥ 0}
- Метод замены переменной (4-степени корни в квадратные)
- Интерактив 1: простейшие (6 заданий с корнями или числом)
- Интерактив 2: 'сколько истинных корней?' (5 с проверкой)
- Босс §17: 6 этапов
Финал главы 2 — 4 интегрированных босса:
- Hero card с градиентом violet, 3 плашки-метки
- Общий прогресс-бар 'X / 4 побеждено'
- Босс 1 §13-§14: определение + свойства
- Босс 2 §15: преобразования
- Босс 3 §16: функция и график
- Босс 4 §17 + синтез: уравнения + смешанные
- Celebration 'МАГИСТР КОРНЕЙ' (скрытая) + ачивка
- Своё состояние в localStorage
XP до 200 за финал + ачивка root_master (+100 XP).
Файл вырос с 6 KB (stub) до 107 KB (1490 строк).
Глава 2 готова на 100%.
Учитель может выбрать любой активный учебник из каталога /api/textbooks
и открыть его в общем iframe для всех участников. По аналогии с симуляциями:
- Backend: контроллер classroom/textbook.js + 4 роута
(POST/DELETE /:id/textbook, /:id/textbook/nav, /:id/textbook/mode)
с SSE-событиями classroom_textbook_open|close|nav|mode
- Embed-режим /textbook/:slug?embed=1: сервер injectит CSS+JS-bridge
перед </head>, скрывая хедер/сайдбар и пересылая клики/скролл наверх
через postMessage (без правки 40+ HTML-учебников)
- Frontend (classroom.html): кнопка «Учебник» в header, пикер с
фильтрами по предмету, iframe-панель с режимами демо/свободно,
relay nav-событий учителя → всем студентам в demo-режиме
Проблемы старого рисунка:
- Метки 'P_α' и 'P_{2α}' рисовались как SVG <text>, а KaTeX
не обрабатывает SVG — фигурные скобки '{2α}' показывались как
литерал, выглядело как «P_{2α}»
- Угол 2α = 70° был слишком близко к оси y, метка P_{2α}
наезжала на цифру '1' оси y
- Подзаголовок 'α = 35°, 2α = 70°' тоже перекрывался
Что переделано:
- Углы изменены на textbook-стандарт: α = 30°, 2α = 60°.
Это даёт хорошо видимое разделение и удобные значения для
вспоминания формул
- Размер канваса увеличен до 380x360, радиус R=130 — больше
пространства для подписей
- Точки и подписи рисуются вручную (без c.point auto-label),
потому что нужно тонкое позиционирование чтобы не пересечь
'1' на оси y
- Подписи изменены на 'P(α)' и 'P(2α)' — скобки решают проблему
визуально (math-нотация) и не используют braces которые SVG
рисует литералом
- Подписи углов 'α' и '2α' расположены на биссектрисах секторов
(через формулу 48*cos(ang/2), 48*sin(ang/2)) — посередине
внутри своего сектора
- Усилены: размер шрифта 13, font-family Unbounded для контраста
с Inter в остальном тексте
- Жирность fill-цвета увеличена (rgba .22 → .30 для α сектора)
Заменены 3 SVG-плакаты (формул сложения, двойного аргумента,
сумма→произведение) на HTML-карточки с настоящим KaTeX-рендерингом.
Добавлен CSS-компонент .formula-plate с подкомпонентами:
- .formula-plate-head + цветовые варианты (teal/cyan/violet/green/amber)
→ плашка-заголовок с градиентом
- .formula-plate-title + .formula-plate-sub
→ крупный заголовок + курсивный подзаголовок
- .formula-plate-body + .formula-row + альтернативные цвета
→ строки формул с подсветкой
- .formula-section (янтарная вставка для tg)
- .formula-mnem (фиолетовая плашка с мнемоникой)
§10: 8 формул в HTML-плакате с teal-плашкой + янтарный блок 'Тангенсы'
§11: 3 формулы двойного аргумента отдельным плакатом ПЕРЕД SVG
с окружностью (которая теперь короче — без встроенного
формульного блока)
§12: 4 формулы в violet-плакате + фиолетовая плашка 'Мнемоника' со
списком правил
Все формулы теперь рендерятся настоящим KaTeX с дробями \dfrac,
правильными операторами \tg \sin \cos, греческими буквами
\alpha \beta, и индексами/степенями.