# Phase 2: Extract inline `<script>` glue → `frontend/js/labs/lab-glue.js`

**Status:** ✅ Done
**Parent plan:** [PLAN.md](./PLAN.md)
**Domain:** frontend

## Objective

Вынести 825L inline `<script>` блока (lines 4327-5152) из lab.html в отдельный `frontend/js/labs/lab-glue.js`. Этот блок содержит glue-код (sim-switcher logic, init helpers, event wiring). lab-init.js остаётся orchestrator'ом.

## Tasks

- [ ] Определить точные границы inline `<script>` блока (line 4327 start, find matching `</script>`)
- [ ] Создать `frontend/js/labs/lab-glue.js`
- [ ] Скопировать содержимое в lab-glue.js
- [ ] **Сохранить порядок загрузки**: lab-glue.js должен подгружаться ПОСЛЕ всех `labs/*.js` engine-модулей И ПЕРЕД `labs/lab-init.js` (или после — зависит от dependencies, проверить!)
- [ ] Удалить inline блок из lab.html
- [ ] Добавить `<script src="/js/labs/lab-glue.js"></script>` в правильное место
- [ ] Verify: page loads, `console.log` ошибок нет, sim-switcher работает
- [ ] Smoke: переключить 3-4 разных sim, проверить что render запускается

## Files to Modify/Create

- `frontend/js/labs/lab-glue.js` — NEW (~825L)
- `frontend/lab.html` — удалить inline `<script>` блок, добавить `<script src>` тег (net −823L)

## Acceptance Criteria

- lab.html без большого inline `<script>` блока на lines 4327-5152
- `/lab` отвечает 200
- No `ReferenceError` / `is not defined` в console (load-order правильный)
- Sim-switcher переключает sims корректно
- 5 любых симуляций инициализируются и рендерятся

## Notes

### Load-order анализ

Перед extract — проверить какие globals использует inline glue:
- Если использует `CollisionSim` (из engine-modules) → нужно загружаться ПОСЛЕ engine-modules
- Если использует `Lucide` (CDN) → после Lucide
- Если других inline-vars нет — безопасно вынести

### Watch for

- Inline `<script>` без `defer` атрибута выполняется sync — после переноса в external может выполниться раньше DOM ready. Возможно нужен `DOMContentLoaded` wrapper, либо `defer` атрибут.
- `window.xxx = ...` глобальные exports должны остаться (onclick handlers HTML on них опираются)

### Strategy

1. Read весь inline блок
2. Identify все function/var declarations
3. Скопировать как есть в lab-glue.js
4. Add at top: `'use strict';` если ещё нет
5. Тестировать пристально

## Review Checklist

- [ ] lab-glue.js загружается в правильном порядке (после engine modules)
- [ ] No console errors на /lab
- [ ] Sim-switcher работает (тест: переключить projectile → newton → chemsandbox)
- [ ] Все onclick handlers HTML работают
- [ ] No emoji в коде
- [ ] Pre-commit hook passes

## Handoff to Next Phase

<!-- Implementer фиксирует: где находится hash-router-точка-расширения (Phase 4 будет добавлять hashchange handler сюда). -->
