§12 «Математика вокруг нас»: задачи из жизни (покупки, сдача, измерения)
+ среднее значение. Финал главы: бой с 5 боссами (разряды, округление,
сложение/вычитание, умножение, деление на дробь) с HP-баром; победа 4/5+
даёт +40 XP и достижение «Глава 1 пройдена». Эталонная Глава 1 готова: все
12 параграфов наполнены. Тесты 12/12.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Перенесён подход из редактора теории:
- модалка «Вставить формулу»: палитра символов по категориям
(греческие/операции/степени/отношения/стрелки/скобки/физика),
LaTeX-поле, живое KaTeX-превью, режим «в строке \( \)» / «блоком \[ \]»
- кнопка «ƒₓ» у каждой стороны карточки и в add-bar; вставка в активное поле
- палитра на data-tex + делегирование (inline-onclick схлопывал «\» в латехе)
- Ctrl+Enter в поле формулы = вставить; разделители совпадают с рендером изучения
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- модалка в 2 шага: текст -> предпросмотр карточек, к каждой стороне
можно прикрепить картинку перед импортом
- addCardsBulk принимает front_image/back_image (через safeImg) и теперь
санитизит front/back (stripTags) — раньше bulk пропускал теги
- общий ensureImgPicker() переиспользуется редактором и предпросмотром
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
renderFlashcardWidget рисует front_image/back_image на обеих сторонах;
.fcw-inner.has-img расширяет высоту карточки под изображение.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Миграция 048: колонки front_image/back_image в flashcard_cards
- Бэкенд: POST /api/flashcards/upload (multer, 5МБ, только изображения),
валидатор safeImg (только /uploads/flashcards/..., блок XSS/traversal/external),
картинки в add/update/quick/study/random; статик-маунт /uploads/flashcards
- Редактор: превью+кнопка загрузки+вставка (Ctrl+V) на каждую сторону,
картинки к ещё не созданной карточке через add-bar
- Режим изучения: рендер изображения над текстом на обеих сторонах
- FAB: вставка картинки в быструю карточку
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- .claude/rules/search-tools.md — матрица: ast-index (символы/usages/callers/outline),
vex (semantic/similar/pattern/duplicates/show)
- usages/callers по JS — только ast-index (vex пропускает)
- CLAUDE.md и ast-index.md ссылаются на новое правило
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
~45 SVG-превью (P_*) и хелперы _grid/_axes/_svg вынесены из lab-glue.js в
общий /js/lab-previews.js: window.LabPreviews (карта id→SVG, 40 симуляций) +
window.__LabP (по имени, lab-glue берёт алиасы оттуда). SIMS не тронут.
lab.html подключает lab-previews.js перед lab-glue.js. Теперь дашборд берёт
настоящие превью симуляций из того же источника → «Лаборатория дня» крутит
весь каталог, а не 6 захардкоженных. Дублирование 6 превью устранено.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Декоративный SVG-фон (открытая книга) поверх градиента
- Тег-пилл с frosted-glass эффектом
- Progress bar 7px с белым свечением
- Мета и процент сгруппированы слева, кнопка — справа с тенью
- Градиент обогащён третьим стопом (#8b3010)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Раньше карточка использовала захардкоженный список из 6 симуляций и не знала
о каталоге. Теперь ежедневный выбор берётся из /api/lab/sims: только включённые
симуляции, у которых есть превью (приоритет featured), title/категория — из БД,
поэтому переименование/выключение/рекомендация в админке отражаются автоматически.
Время/уровень/цель — из curated-карты по id (в каталоге их нет) c дефолтами.
Фолбэк на статичный список, если API недоступен. Заодно исправлен mismatch
isoprocess→molphys (href теперь = id симуляции).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Мелодию-вызов перевёл с кастомного Web Audio на общий движок звуков LS.sfx:
- длинный вестминстерский бой теперь в sound.js (звук lesson_start);
- api.js лениво подгружает sound.js на любой странице и играет lesson_start
по SSE classroom_started (вместо собственного синтезатора);
- отдельный pref lessonCall + тумблер «Вызов на урок» и кнопка прослушивания
в профиле (Настройки → Звуки); уважает мастер-тумблер и громкость;
- lesson_start выведен из категории classroom (управляется своим тумблером);
- разблокировка AudioContext по первому жесту перенесена в sound.js.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Расширил перезвон с одной нисходящей фразы до полного боя из 5 фраз по 4 ноты
(G4/C5/D5/E5) с паузами между фразами и протяжной финальной нотой (~7-8 с).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>