4.4 KiB
4.4 KiB
Phase 0: Спека v1 + рантайм (формульные сцены)
Status: ⬜ Not Started Parent plan: PLAN.md Domain: frontend
Objective
Заложить ядро: формат JSON-спеки v1, безопасный движок выражений, рантайм SimEngine,
адаптер регистрации в LabRegistry. После фазы рукописная спека «брошенное тело» играет в /lab.
Tasks
- Задокументировать формат спеки v1 в шапке нового файла + в CONTEXT.md (params, objects, viewport, controls).
frontend/js/labs/_sim_expr.js— безопасный движок выражений: токенайзер → AST →evaluate(ast, env). Whitelist математики (см. CONTEXT.md). Парсер расширяет логикуy=f(x)изgraph.js(посмотреть и переиспользовать, не дублировать). ⛔ безeval/Function.compile(src) -> {fn(env), error}.frontend/js/labs/_sim_engine.js—window.SimEngine.mount(host, spec):- создаёт canvas (мир→экран трансформация по
viewport) + оверлей-слой для подписей (KaTeX через существующий путь рендера формул); - объекты: point|segment|vector|circle|rect|polyline|path|label (числовые свойства = число или строка-выражение, компилируются один раз);
- игровой цикл
requestAnimationFrame: пересчётt, перевычисление привязок, перерисовка; - контролы: слайдеры-параметры (из
params[]), кнопки play/pause/reset; API инстанса{ play, pause, reset, setParam, destroy }.
- создаёт canvas (мир→экран трансформация по
frontend/js/labs/_sim_adapter.js—registerSpecSim(spec)строит манифест LabRegistry (open(ctx)→SimEngine.mount,stop/destroy,previewиз спеки) и регистрирует.- Фикстура-демо: рукописная спека «projectile» (угол/скорость слайдеры, точка x=v·cosθ·t, y=v·sinθ·t−5t²) — зарегистрировать как
customdemoдля проверки в /lab (за временным флагом/разделом, не светить ученикам). - Подключить новые файлы в /lab (lazy через существующий
_loader/_sim_depsили прямыми тегами — выбрать минимально-инвазивно, не ломая старт).
Files to Modify/Create
frontend/js/labs/_sim_expr.js— движок выражений (new)frontend/js/labs/_sim_engine.js— рантайм (new)frontend/js/labs/_sim_adapter.js— адаптер LabRegistry (new)frontend/js/labs/_sim_demo.js— демо-спека-фикстура (new, временная)frontend/lab.htmlили_sim_deps.js— подключение файлов (минимальная правка)
Acceptance Criteria
- В /lab открывается демо-симуляция, слайдеры меняют движение, play/pause/reset работают.
- Движок выражений не использует eval/Function; некорректная формула не роняет рантайм (показывает ошибку/0).
- Существующие ~40 симуляций и старт /lab не сломаны.
Notes
- Подписи с LaTeX — переиспользовать существующий рендер формул (KaTeX), не тянуть новый.
- Мир-координаты с осью Y вверх (математические), трансформация в экранные внутри движка.
- Производительность: компилировать выражения один раз при mount, в цикле только evaluate.
Review Checklist
- Все задачи выполнены
- Нет eval/new Function в движке выражений
- Нет эмодзи (только SVG .ic)
- Старт /lab и существующие симуляции не регрессировали
- Код в стиле проекта (vanilla, IIFE-модули labs/)