Кнопка «Создать карточку» в пустом состоянии вызывала click() по FAB,
но исходный клик всплывал до document-листенера, который сразу закрывал
поп-ап — внешне ничего не происходило. Заменено на ссылку на /flashcards.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Источник — /api/textbooks (как страница «Учебники»):
- учебник в процессе (есть прочитанные §) → «Продолжить чтение» с
прогресс-баром и «N из M § прочитано», ссылка на last_para;
- иначе первый учебник каталога → «Начать чтение», «M § · новый учебник»;
- фон карточки = градиент обложки по t.color (TB_COVER — зеркало
.tb-cover из textbooks.html), полная синхронизация цвета.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Классы .lb-tab/.lb-tabs/.lb-row/.lb-list/.lb-avatar и др. отсутствовали
в profile.html — карточка рейтинга рендерилась голой. Добавлены стили
под дизайн-систему профиля.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Иконка Lucide 'running' не существует, поэтому createIcons() оставлял
<i> пустым — у испытания типа 'tests' не было иконки. Заменено на
валидную 'footprints'.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Раньше при отсутствии начатого курса карточка оставалась статичной
заглушкой («Учебники»). Теперь:
- при прогрессе — «Продолжить чтение»: курс, урок, прогресс-бар, %;
- иначе — рекомендованный учебник из /api/courses: название, описание,
число параграфов;
- фон-градиент карточки по предмету (SUBJ_GRADIENT, как обложки).
Синтаксис всех инлайн-скриптов проверен (0 ошибок).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Раньше карточка пряталась при отсутствии данных API — выглядело как
«рейтинга нет». Теперь всегда видна: либо список, либо подсказка
«Пока нет данных рейтинга».
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- loadActivityWidget показывает блок всегда (пустое состояние рисует
renderHeatmap), даже при 0 сессий и при ошибке истории.
- .bottom-grid: align-items stretch + height 100% — карточки ряда
(Активность/Мои сдачи/Испытания) одной высоты.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Контейнер lb-section не попал в файл ранее — loadLeaderboard молча
выходил. Теперь рейтинг реально виден в табе «Достижения».
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Карточка рейтинга с табами Неделя/Всё время, /api/gamification/leaderboard,
самодостаточный JS (свой esc). Рейтинг убран с дашборда ранее.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Блок «Активность» (heatmap + календарь) вынесен из 3-й колонки в
отдельный нижний ряд .bottom-grid рядом с «Мои сдачи» и «Испытания».
- Удалён остаток разметки «Теория — в процессе» и разметка рейтинга
(lb-section) с дашборда; конфиг виджетов обновлён (Активность вместо
Теории/Рейтинга).
- Селектор скрытия для учителя и адаптив обновлены под .bottom-grid.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Полный XP и абсолютный порог уровня (d.xp / d.xpForNextLevel),
уровень пользователя d.level — как в pet.html, а не относительный
расчёт по petLevel.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Функция loadPetHero вызывалась, но её тело не попало в коммит
667054f (Edit не применился). Восстановлено: рендер питомца через
PetSprite + загрузка /api/pet, как и задумано.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Рейтинг (lb-section) перенесён в профиль — удалён с дашборда вместе
с вызовами loadLeaderboard()/_populateLbClasses() и тоглом конфига.
- Виджет «Теория» (w-theory-progress) удалён вместе с тоглом конфига.
- applyDashboardPrefs/toggleDashWidget null-безопасны к удалённым id.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Пересборка верхней зоны дашборда по скриншоту (редизайн был утерян):
- 3 hero-карточки вместо action-cards: «Начать чтение» (продолжение
курса через /api/courses/continue), «Лаборатория дня» (детерминир.
выбор по дню + SVG-превью из lab-previews.js), «Питомец» (синхрон
с модулем /pet через /api/pet + единый PetSprite.render).
- Подключены восстановленные ассеты pet-sprite.js и lab-previews.js.
- Убран weak-topics из hero; питомец показывает уровень/XP/стрик/
цель дня/настроение, синхронно со страницей /pet.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Кнопки инбокса (Открыть/Разблокировать/Разобрать) и ссылки
все алерты/все сессии вели на голый #hash и оставались на /dashboard.
Теперь ведут в /admin#sessions|#users. fmtSince показывает дни для
сессий старше 48ч (1888ч → 78д 16ч).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Админ при входе на /dashboard видит редизайн-обзор (порт макета
admin-dashboard-redesign.html) на реальных данных /api/admin/overview:
KPI-пульс со спарклайнами, инбокс «Требует внимания» с табами
(блокировки/зависшие/брошенные), лента топ-сессий, распределение по
предметам, здоровье контента, топ/худшие результаты, быстрые действия.
Стили заскоуплены под #admin-command-center. Учитель/ученик без изменений.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Backend:
- POST /api/flashcards/quick — добавить карточку из любой точки; колода по
выбору или автоколода «Быстрые карточки» (создаётся при первом обращении)
- GET /api/flashcards/random — случайная карточка из всего пула пользователя
Frontend:
- /js/flashcard-fab.js — плавающая кнопка «запомнить» на всех страницах
(учебник, лаборатория, симуляция…). Поповер: вопрос/ответ/колода, Ctrl+Enter.
Гейт по фиче-флагу flashcards; исключены classroom/login/error/сама /flashcards.
Загружается лениво из sidebar.js (на 45 страницах с шапкой).
- dashboard: виджет #w-flashcard в колонке прогресса — флип-карта (вопрос↔ответ),
кнопка «Другая», счётчик пула, CTA при пустом пуле; слушает событие
flashcard:added для авто-обновления.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
LS.api = apiFetch — принимает полный путь без автодобавления /api/.
Все 12 вызовов исправлены: /flashcards/... → /api/flashcards/...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
const COLORS и let _deckColor объявлены в temporal dead zone во время
вызова init() из IIFE (const не hoisting, function — да). Перемещены
перед IIFE: теперь COLORS инициализирован до первого вызова buildColorPicker().
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- flashcards.html: замена несуществующего LS.init() на LS.initPage()
с деструктуризацией { user }; аватарка через LS.renderNavAvatar
- sidebar.js: добавлена ссылка /flashcards (иконка copy) в раздел «Знания»
после «Карта знаний»; feature_flashcards_enabled=1 в БД уже активен
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Проблема: динамическая вставка через JS вызывала мигание (nav
появлялся через ~100ms после первого пейнта).
Решение: nav — статичный HTML в каждой странице, CSS — в <head>.
Активная вкладка проставлена в HTML (class bsn-active) — нет JS,
нет мигания, работает с первого байта.
Редизайн .biochem-subnav:
- frosted glass (backdrop-filter blur 14px, rgba 0.92)
- активная вкладка: фиолетовый фон-пилюля + нижняя линия 2.5px
- hover: мягкий фиолетовый фон
- mobile <560px: только иконки (bsn-label display:none)
- overflow-x auto + scrollbar-width:none — горизонтальная прокрутка без полосы
- biochem-nav.js сведён к no-op комментарию
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Новый /js/biochem-nav.js: вставляет sticky-полосу .biochem-subnav
с вкладками Редактор / Библиотека / Реакции / Свойства / Пути.
Текущая вкладка подсвечивается (bsn-active + фиолетовая нижняя линия).
На узких экранах (<560px) — только иконки. Скрипт подключён на всех 5 страницах.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Причина: Python-скрипт при удалении секций нарушил баланс div-ов (diff=-2).
Решение: восстановлен файл из коммита 2354353, все правки через Edit.
Изменения:
- div balance восстановлен: 0
- s-14-4 (управление симуляциями) и s-16-3 (начисление XP) убраны из teacher-глав
- CHAPTERS в JS: s-14-4 и s-16-3 убраны из sections/sLabels ch-14/ch-16
- buildNavItem(): общая функция рендера пунктов nav (teacher + admin)
- Admin блок (ch-a1..ch-a6): display:none → show при isAdmin
- ALL_CHAPTERS(), scrollToSection, updateReadUI, initHash обновлены
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
+ Глава 14: Виртуальная лаборатория (40 симуляций, deep-link, стереометрия 3D,
связь с учебниками, управление в админке)
+ Глава 15: Биохимия (молекулярный редактор 2D/3D, VSEPR, SMILES, валентность,
библиотека, реакции с ΔH, метаболические пути)
+ Глава 16: Геймификация (XP/уровни/достижения, питомец эволюция/цвет/настроение,
начисление XP через панель, сброс прогресса)
+ Глава 17: Доступ к контенту (allowlist учебников/экзаменов по классам,
feature flags, System Health)
~ Ch-13: nav → ch-14 вместо ch-1; убран «Готово! 13 глав»
~ CHAPTERS array: 13 → 17 записей, прогресс-бар пересчитается автоматически
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- gam-award-grid/gam-reset-grid: CSS Grid, адаптив 800px
- gam-user-col/filter/select — единые стили из design system
- gam-preset/gam-reason-tag — через CSS-классы, без inline
- gam-num-input: Unbounded шрифт, выровненный по центру
- gam-award-footer + gam-reset-warning как отдельные блоки
- убраны все эмоджи; пресеты сбрасываются через gamSetXP/gamSetCoins
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- select с полным списком пользователей + фильтр по имени (вместо typeahead)
- пресеты XP (0/10/25/50/100/250) и монет (0/10/25/50) с подсветкой активного
- пресеты причин (кнопки) + поле для своей причины
- fix: xp/coins теперь Number(value) без || 0 — значение 0 не начисляется
- форма сброса прогресса — тоже select из того же кэша пользователей
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Заменил ручное ava.textContent=initials на LS.renderNavAvatar(ava, user)
в biochem.html / -library / -reactions / -properties.
biochem-pathways.html уже был корректен.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- biochem-core.js dual-export (browser window.BIO + Node module.exports), без дублей
- BIO.valency: подробные подсказки валентности (2.4), общие для редактора и сервера
- services/chem.js: серверный анализ поверх того же ядра (analyze/validate)
- POST /api/biochem/analyze (2.2); /validate переведён на ядро (+фикс формата связей)
- api.js: LS.biochemAnalyze
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Следим только за src/ (js,json,yaml), игнорируем тесты; data/, логи и
uploads/ вне src/, поэтому циклов перезапуска нет. Запуск: npm run dev.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Секция игнорировала флаг allow_html и всегда экранировала текст/опции/
пояснение, из-за чего <div class=task-figure><img>, <b> и пр. показывались
как сырой текст. Теперь — как в test-run.html: allow_html ? raw : esc.
Также добавлен q.allow_html в SELECT списка вопросов (его не было в ответе API).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
renderMath в _shared.js распознавал только \(…\) и \[…\], из-за чего
873 вопроса с долларовыми разделителями не рендерили формулы в админке.
$$ ставится раньше $, чтобы auto-render не принял его за два пустых $.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
§9: добавлена схема «связей-крючков» (Chem7Anim.valenceLink, SVG) — атомы A и B
с чёрточками валентности, связи прорисовываются (draw-in); число связей = НОК.
§12: под балансировщиком — анимированный подсчёт атомов (реагенты vs продукты),
атомы-точки появляются масштабированием; подтверждается баланс слева=справа.
Все интерактивы Химии 7 анимированы. Тесты chem7: 16/16; полный прогон 162/165.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
~15 флагманских анимированных интерактивов поверх готового учебника:
общий движок chem7_anim.js (частицы, пузырьки, пламя, морфинг цвета,
RAF-реестр с паузой вне экрана), апгрейд виджетов по главам
(разделение смесей, 3D-молекулы, горение, ряд активности с пузырьками,
электролиз 2:1, титрование). Фазы V0-V5, правила (reduced-motion,
тёмная тема, перф, достоверная химия). Монтаж в существующие контейнеры.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Кнопка на карточке учебника наследовала .tb-btn{flex:1} и растягивалась
наравне с «Продолжить» — длинный текст переносился на 3 строки, колба
вставала посреди слова. Теперь .tb-lab-btn — компактный квадрат (как
кнопка ДЗ): только колба, при нескольких связях добавляется число;
полное название в title. flex:0 0 auto + white-space:nowrap убирают
перенос, колба тонирована в --violet как научный акцент.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Страницы глав наследовали amber-палитру chem8-textbook.css и базовый
.para-hero без фона (нужен модификатор .ph-N) → блок заголовка § сливался
с фоном. Добавлен per-chapter <style>: своя палитра (emerald/cyan/violet/blue,
как карточки в хабе) + сплошной градиент .para-hero. Тесты chem7: 15/15.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
§23 Состав и свойства воды (разложение 2:1 + реакции воды),
§24 Основания (конструктор Me(OH)n + индикаторы щёлочи),
ЛО5 Действие щелочей на индикаторы,
§25 Реакция нейтрализации (анимация фенолфталеин малиновый → бесцветный),
ПР4 Реакция нейтрализации, §26 Охрана окружающей среды (экология-инфографика),
финал главы (6 боссов). chem7_ch4_widgets.js.
ВСЕ 26 параграфов курса «Химия 7» наполнены. Тесты chem7: 15/15 pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
§21 Кислоты и металлы (интерактивный ряд активности),
ЛО4 Кислоты с металлами (опыт: пузырьки H2, медь не реагирует),
§22 Соли как продукты замещения (конструктор солей по валентности),
ПР3 Получение водорода (проверка чистоты — гремучий газ),
финал главы (6 интегрированных боссов + шпаргалка).
Глава 3 «Водород» наполнена полностью (§§18–22). Тесты chem7: 14/14 pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
§18 Водород — элемент и простое вещество (паспорт + модель H2),
§19 Химические свойства водорода (горение → вода, восстановление CuO → Cu),
§20 Понятие о кислотах (индикаторы лакмус/метилоранж + таблица кислот),
ЛО3 Действие кислот на индикаторы. chem7_ch3_widgets.js. Тест: 13/13 pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
adminController.getHealth: активные health-проверки — отклик БД (ping, мс) и
тест записи на диск рядом с БД; вердикт уходит в critical при недоступной БД
или диске, warning при медленном отклике БД (>100мс). Плюс recentErrorList —
последние 8 записей error_log (level/route/method/message/время).
admin.js: панель «Диагностика» — индикаторы БД/диска (зелёный/красный) +
лента последних ошибок с цветом по уровню.
Проверено: checks {dbOk,dbPingMs,diskWritable}, список ошибок отдаётся.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
metrics.js: сэмплинг раз в минуту в кольцевой буфер (cap 24ч, unref) —
ts/rss/heapUsed/reqPerMin/reqDelta/err5xx/p95; history() + поле history в
snapshot (последние 180 точек).
admin.js: секция «Тренды» с 4 мини-графиками (canvas): Память RSS, Запросы/мин,
Ошибки 5xx, Латентность p95 — линия + заливка + подписи макс/последнее.
Обновляются вместе с live-рефрешем.
Проверено: сэмплер пишет, история в snapshot, графики рисуются (на старте —
«накопление данных…», далее наполняются).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>