Питомец: кастомный фон (миграция 068 pet_bg_custom, POST /api/pet/bg/custom,
карточка «Свой фон (ИИ)» в гардеробной, применение картинкой).
Курсы: обложка-картинка (миграция 069 cover_image, генерация в модалке
редактирования, рендер вместо эмодзи).
Аватар: кнопка «Сгенерировать (ИИ)» в загрузке → кадрирование → модерация.
Доска (classroom): кнопка-инструмент «Сгенерировать картинку (ИИ)».
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Цвета 6→11 (розовый/оранжевый/бирюза/лайм/индиго). Узоры 5→8
(сердечки/звёздочки/клетка). Аксессуары 11→18 + новая зона «В лапах»
(бини, нимб, монокль, медаль, серёжки, палочка, шарик). Разблокировка за
учёбу: нимб (8 достижений), медаль (30 тестов). Фоны 7→11
(класс/лаборатория/зима/радуга) с градиентами и частицами. Новая вкладка
«Образы» — 4 готовых набора (Учёный/Волшебник/Чемпион/Милашка) применяют
аксессуары+узор+цвет одним кликом.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Перед платной покупкой фона — диалог LS.confirm («Купить «X» за N монет?»)
+ предпроверка баланса (тост, если монет не хватает). Применение уже
купленных/стандартного — без подтверждения.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
База дизайна светлая (--surface≈белый), а заливки/границы модалки были
белым-альфа → исчезали. Переведено на тёмные токены: --border вместо
white-alpha, тёмные тинты для карточек зон/кнопок/таб-бара, надетый тайл —
сплошной фиолетовый с белым текстом, имя/счётчик — насыщенные цвета.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Тонкие линии-разделители заменены на карточки зон (фон + рамка + отступы),
тулбар «Надето/кнопки» отделён отступом. Блоки больше не сливаются.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Золотой текст на бледно-золотом фоне сливался. Теперь яркий золотой
градиент + тёмно-коричневый текст/иконка — читается на любом фоне.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Освещённая ниша превью (верхний свет + фиолетовый пьедестал-glow снизу,
краевая виньетка, объёмная тень), имя градиентом, чип баланса монет в шапке.
Контролы: вкладки с градиентной активной, аксессуар-тайлы с подъёмом и
glow (надетое — градиент-заливка), крупные цветовые кружки с кольцом,
узор-плитки и фон-карточки с подсветкой/подъёмом и активным кольцом.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Размер стоял на самом <svg> (width:86%), а его родитель #wr-preview-svg —
пустой div без заданной ширины → процент считался от неопределённой ширины
и питомец смещался. Размер задан обёртке (#wr-preview-svg width:82% от сцены),
svg внутри 100%; сцена — flex-центрирование. Парение перенесено на обёртку.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Кнопка «Нарядить» на сцене открывает модалку: слева крупное живое превью
питомца (обновляется мгновенно при любой смене — аксессуар/цвет/узор/фон),
справа вкладки Аксессуары/Цвет/Узор/Фон. Превью-сцена отражает выбранный
фон. Закрытие крестиком, кликом по фону, Esc. Инлайн-карточка убрана со
страницы; все рендереры идут через общий paintPet (сцена + превью).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Контейнер #pet-accessories наследовал старый .pet-accessories
(display:flex center) → панель действий и зоны сваливались в один поток.
Снял класс + #pet-accessories{display:block}: тулбар с разделителем сверху,
каждая зона — отдельная строка (подпись справа фикс-ширины + плитки),
тонкие разделители, иконки на кнопках «Случайный образ»/«Снять всё».
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Премиальная карточка с градиентом и заголовком-иконкой; сегментные вкладки
с иконками и подсветкой активной; аксессуары — тайлы по зонам с галочкой
вместо текстовых чипов; узор — крупные превью-плитки с подписью; фон —
увеличенные карточки; плавное появление панелей.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Вынес кастомизацию из тесного блока сцены в отдельную карточку с вкладками
«Аксессуары · Цвет · Фон». Фон теперь выбирается инлайн (сетка превью с
ценой/статусом, покупка/выбор за монеты) вместо незаметной кнопки-модалки.
Добавил легенду эволюции: облик (уши/антенны/крылья/аура…) растёт с XP по
уровням — объясняет «откуда крылья». Рендереры цвета/гардероба не тронуты
(те же id), бэкенд без изменений.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Аксессуары больше не навешиваются авто по уровню — теперь разблокируются
и НАДЕВАЮТСЯ по выбору (один на слот). Новые: шапочка выпускника, наушники,
бабочка (бесплатные — доступны даже при 0 XP). Сохранены цилиндр/корона/очки/
звезда с прежними порогами; дефолт повторяет старый вид (без сюрпризов).
Бэкенд: миграция pet_equipped, каталог ACCESSORY_CATALOG + /api/pet/equip
(валидация разблокировки и слотов). Рендер аксессуаров строго по equipped —
в обеих копиях (pet.html и pet-sprite.js для дашборда). UI гардероба на /pet.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Зафиксирована накопленная незакоммиченная работа рабочего дерева, КРОМЕ файлов
учебника «Химия 7» (migration 046, chemistry_7_*.html, chem7_svg.js, тест —
оставлены незакоммиченными по запросу).
Включает: модуль биохимии (ядро BIO, 3D VSEPR, химдвижок, баланс, challenges,
пути из БД), System Health Level 1 (вердикт/мониторинг), а также frontend-
страницы и lab/textbooks-правки параллельной сессии.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Add js/sidebar.js: generates full sidebar HTML into #app-sidebar,
handles role-based visibility, active link (with prefix matching),
toggle wiring, collapsed state, board/features/notif init
- Replace <aside class="sidebar">...</aside> with <aside id="app-sidebar">
across all 35 standard-layout pages via scripts/apply-sidebar.js
- Add notifications.js to 5 pages that were missing it
- Fix api.js initPage(): skip toggle re-wiring if data-sb-wired set,
fix active link selector .sb-item → .sb-link
- Remove stale sbl-*/nav-admin/btn-upload-nav getElementById calls
that crashed after sidebar replacement (lab, classes, collection,
crossword, hangman, knowledge-map, library, pet, profile)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Classroom performance:
- WebSocket server (ws-server.js) for low-latency cursor & stroke preview
Replaces HTTP POST per event → eliminates per-message auth overhead
Session member cache (30s TTL) avoids SQLite query per WS message
Fallback to HTTP POST when WS not connected
- Cursor throttle reduced 100ms → 33ms (~30fps)
- Stroke preview throttle reduced 50ms → 20ms
- whiteboard.js: render() is now rAF-gated (_doRender/_rafPending)
Multiple render() calls within one frame collapse into one repaint
document.hidden check — zero CPU when tab is in background
visibilitychange listener restores canvas on tab focus
Guest board:
- guestClassroom.js route: public token-based read-only access
- guest-board.html: name entry + read-only whiteboard + SSE
- SSE: addGuestClient/removeGuestClient/emitToGuests
Screen share picker:
- Discord-style modal with tab switching (screen/window/tab)
- Live video preview before confirming share
- useExistingScreenStream() in ClassroomRTC
Fullscreen exit overlay:
- #cr-fs-exit-overlay button inside cr-board-wrap
- Visible only via CSS :fullscreen selector (touchpad users)
File sharing from library:
- Teacher picks file from library, sends as styled card in chat
- crDownloadLibraryFile() fetches with Bearer auth
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>