diff --git a/frontend/js/labs/_register-all.js b/frontend/js/labs/_register-all.js index a31b376..c6ddd1b 100644 --- a/frontend/js/labs/_register-all.js +++ b/frontend/js/labs/_register-all.js @@ -82,7 +82,17 @@ desc: s.desc, preview: s.preview, // уже готовая SVG-строка (P_* вычислены в SIMS) theory: T[s.id] || null, - open: open + // Фаза 3: ленивая загрузка кода. LabLoader.ensure(id) подгружает файлы + // симуляции (+ three.js при необходимости), затем выполняется raw-open. + // Если LabLoader недоступен — открываем синхронно как раньше (фолбэк). + open: (function (rawOpen, simId) { + return function (c) { + if (window.LabLoader && window.LabLoader.ensure) { + return window.LabLoader.ensure(simId).then(function () { rawOpen(c); }); + } + rawOpen(c); + }; + })(open, s.id) // stop/destroy: глобальный «дробовик» _pauseAllSims()/closeSim() — паритет }); }); diff --git a/frontend/js/labs/lab-init.js b/frontend/js/labs/lab-init.js index 1986a83..d9eda90 100644 --- a/frontend/js/labs/lab-init.js +++ b/frontend/js/labs/lab-init.js @@ -116,9 +116,18 @@ const _m = window.LabRegistry.get(_cid); const _arg = _cid.includes(':') ? _cid.split(':')[1] : undefined; window.LabRegistry.setActive(_m); - try { _m.open({ id: _cid, arg: _arg }); } - catch (e) { console.error('[LabRegistry] open failed:', _cid, e); } - if (window.lucide) lucide.createIcons(); + // Фаза 3: open() может вернуть Promise (ленивая загрузка кода). Иконки + // перерисовываем после фактической инициализации тела симуляции; ошибку + // асинхронной загрузки ловим через .catch (sync try/catch её не поймает). + try { + const _r = _m.open({ id: _cid, arg: _arg }); + if (_r && typeof _r.then === 'function') { + _r.then(function () { if (window.lucide) lucide.createIcons(); }) + .catch(function (e) { console.error('[LabRegistry] open failed:', _cid, e); }); + } else if (window.lucide) { + lucide.createIcons(); + } + } catch (e) { console.error('[LabRegistry] open failed:', _cid, e); } return; } if (window.console) console.warn('[LabRegistry] неизвестная симуляция:', id);