LabMeasure (_measure.js): SVG-оверлей поверх сцены с pointer-events:none (симуляция остаётся интерактивной), перетаскиваемые ручки. Линейка — длина px + ≈ метры (PX_PER_M) + угол; угломер — угол при вершине с дугой. Кнопка-тумблер в топбаре лаборатории. Самодостаточно, симуляции не трогает. Этим Фаза 2 закрыта. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
7.6 KiB
План улучшения симуляций (лаборатория)
Утверждён 2026-06-13. Цель — улучшить текущие симуляции (~50 шт.), а не наплодить новые.
Текущее состояние
База сильная: data-driven реестр (_registry.js) с ленивой загрузкой и самовосстановлением
(_loader.js, _sim_deps.js), движок LabFX (частицы/звук/анимации), LSGraphPanel,
_phys_visuals, _chem_visuals. Каталог в БД (lab_sims миграция 042 + lab_sim_links 043),
синхрон в онлайн-уроке (controllers/classroom/sim.js).
Эталоны: projectile, pendulum (RK4), opticsbench (Снелл/линзы/дисперсия), circuit (MNA-решатель), trigcircle, titration, race (единственная с задачами+проверкой).
Состав: физика 13, химия 16, математика 9, биология 2, игра 1.
Сквозные пробелы (подтверждены ревью кода, 3 среза)
- Педагогика тонкая — задания/цели/проверка лишь у ~6-8 из ~50; остальные — песочницы. Теория = голые формулы.
- Тач сломан в ~80% — мост
_addTouchSupport(lab-init.js:158) подключён в 2 симуляциях; вёрстка адаптивна, взаимодействие — нет. - Доступность ≈ 0 — нет aria/role/alt на canvas, нет клавиатуры, контраст подписей < AA, нет
prefers-reduced-motion. - Нет сохранения состояния и «в Мои материалы» — нельзя возобновить опыт/сдать результат; PNG-экспорт у 2 симуляций.
- Синхрон в онлайн-уроке частичный —
getState/applyStateу ~11, часто 1 под-режим. - Тех-долг жизненного цикла — нет
destroy, «дробовик»_pauseAllSims/closeSimпо ~40 глобалам; добавить сим = 6+ мест; утечки; мёртвыйSimUtil(_util.js). - Палитра/DPR дублируются в каждом canvas-файле; нет общего JS-модуля токенов; canvas игнорирует светлую тему.
- Производительность — пул частиц обходит все 1500/кадр; нет «эконом-режима»; тяжёлые 3D/двойной маятник.
- Хрупкая вставка в урок —
simIdсырым текстом без списка/валидации (lesson-editor.html).
Фазы
Фаза 0 — Фундамент
SimBase/миксин жизненного цикла:fit/play/pause/reset/destroy/getState/applyState+ DPR из одного места (подключать постепенно).LabPalette— общий JS-модуль цветов/констант (PX_PER_M), задел под светлую тему canvas.- Заполнить
manifest.stop/destroyper-sim → убрать «дробовик». - Убрать мёртвый
SimUtil(или перевести симуляции на него). - lesson-editor: выпадающий список симуляций из
/api/lab/simsвместо сырогоsimId. prefers-reduced-motion+ «эконом-режим» вLabFX(центрально). Закрывает 6,7,8(част.),9.
Фаза 1 — Педагогический слой (макс. эффект)
- Фреймворк заданий (обобщить
race.js):tasks:[{prompt, check(state), tolerance, hint}]+ панель ввода ответа/проверки/прогресса. - «Что понять» + deep-link на § учебника.
- XP за задания (с дневным лимитом, анти-фарм). Закрывает 1.
Фаза 2 — Ценность для ученика
- Сохранение/возобновление параметров (поверх
getState, localStorage + опц. БД). - «В Мои материалы» (скриншот canvas →
student_materials) + «Скачать PNG» везде. - Общие измерительные инструменты (линейка/транспортир/курсор). Закрывает 4.
Фаза 3 — Тач и доступность
- Тач везде (
_addTouchSupportво все canvas-открытия / pointer-events какgeometry.js); pinch-zoom. - aria/role/alt + текстовая сводка состояния; клавиатура; контраст до AA;
prefers-reduced-motion. Закрывает 2,3.
Фаза 4 — Полный синхрон в онлайн-уроке
getState/applyStateдля всех симуляций и под-режимов. Закрывает 5 (опирается на Фазу 0).
Фаза 5 — Производительность и стабильность
- Пул частиц: список живых вместо обхода 1500/кадр; общий RAF-планировщик + пауза по
visibilitychange. - Асинхронная загрузка тел симуляций (сейчас синхронный XHR).
- Фронт-тесты движка. Закрывает 8 + отсутствие тестов.
Фаза 6 — Контент и охват
- Усилить биологию (генетика, экосистемы, ферменты, кровообращение).
- Доработать crystal/orbitals (статичные 3D) — интерактив + задания.
- Допривязать
lab_sim_linksк §§ учебников.
Порядок
Старт — Фаза 0. Затем Фаза 1 (педагогика) + Фаза 3 (тач/доступность) параллельно.
Быстрые победы: тач массово, список симуляций в редакторе урока, reduced-motion/эконом, убрать SimUtil.
Прогресс
- Фаза 0 (фундамент заложен) — эконом-режим/reduced-motion (LabFX, тумблер), выбор симуляции из списка в редакторе урока, удалён мёртвый
SimUtil, добавленыLabPalette(_palette.js) иSimBase(_simbase.js) как опциональные основания. Адаптация симуляций к SimBase/LabPalette и удаление «дробовика»_pauseAllSims/closeSim— постепенно, по мере правок каждой симуляции (требует поштучной проверки, нет фронт-тестов). - [~] Фаза 1 — сделано: фреймворк
LabTasks(_tasks.js) + интеграция в теорию; задания на 17 симуляций. Осталось: XP за задания, deep-link на §, наполнение остальных. - Фаза 2 — «Сохранить кадр в Мои материалы» + «Скачать PNG»; сохранение/возобновление параметров (localStorage, не в embed); измерительные инструменты
LabMeasure(линейка + угломер, SVG-оверлей). Остаток-доработка: 3D/WebGL-снимок (preserveDrawingBuffer), привязка линейки к шкале конкретной симуляции. - Фаза 3
- Фаза 4
- Фаза 5
- Фаза 6