feat(chemistry7): Phase 2 Волна 1 — Глава 2, §13 + ЛО2 + §14 + §15

§13 Воздух как смесь газов (интерактивная диаграмма состава),
ЛО2 Сборка приборов и собирание газов (выбор способа собирания),
§14 Кислород — элемент и простое вещество (переключатель O/O2/O3 + модели),
§15 Химические свойства кислорода (симулятор горения C/S/P/Fe/Mg → оксид).
chem7_ch2_widgets.js. Тест: 11/11 pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-05-30 18:40:16 +03:00
parent a6567d0938
commit e949cb18a5
3 changed files with 321 additions and 5 deletions
+15
View File
@@ -24,6 +24,7 @@ function buildPage(file) {
'/js/chem8_svg.js': readF('frontend/js/chem8_svg.js'),
'/js/chem7_svg.js': readF('frontend/js/chem7_svg.js'),
'/js/chem7_ch1_widgets.js': readF('frontend/js/chem7_ch1_widgets.js'),
'/js/chem7_ch2_widgets.js': readF('frontend/js/chem7_ch2_widgets.js'),
'/js/chem8_engine.js': readF('frontend/js/chem8_engine.js')
};
html = html
@@ -133,6 +134,20 @@ test('ch1: переход к §9 и финалу строит без ошибо
assert.deepEqual(errors, [], 'нет ошибок: ' + errors.join(' | '));
});
test('ch2 Волна 1: интерактивы §13 + ЛО2 + §14 + §15 монтируются', async () => {
const { doc, errors } = await loadDom('chemistry_7_ch2.html');
assert.ok(doc.querySelector('#p13-air .air-seg'), 'диаграмма состава воздуха §13');
doc.defaultView.goTo('lo2'); await wait(100);
assert.ok(doc.querySelector('#lo2-coll #lo2-pick'), 'выбор собирания газа ЛО2');
doc.defaultView.goTo('p14'); await wait(100);
assert.ok(doc.querySelector('#p14-tog #p14-o2'), 'переключатель элемент/вещество §14');
doc.defaultView.goTo('p15'); await wait(100);
assert.ok(doc.querySelector('#p15-burn #p15-go'), 'симулятор горения §15');
doc.defaultView.goTo('p15'); doc.getElementById('p15-go').dispatchEvent(new doc.defaultView.Event('click', { bubbles: true }));
assert.match(doc.querySelector('#p15-out').textContent, /оксид/, 'горение даёт оксид');
assert.deepEqual(errors, [], 'нет ошибок: ' + errors.join(' | '));
});
/* ── Хаб: каталог глав + финал курса ── */
function buildHub() {
let html = readF('frontend/textbooks/chemistry_7_hub.html');