diff --git a/backend/tests/chemistry7-page.test.js b/backend/tests/chemistry7-page.test.js
index 067e6d1..dc4c4c6 100644
--- a/backend/tests/chemistry7-page.test.js
+++ b/backend/tests/chemistry7-page.test.js
@@ -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');
diff --git a/frontend/js/chem7_ch2_widgets.js b/frontend/js/chem7_ch2_widgets.js
new file mode 100644
index 0000000..4109066
--- /dev/null
+++ b/frontend/js/chem7_ch2_widgets.js
@@ -0,0 +1,192 @@
+/* chem7_ch2_widgets.js — интерактивы главы 2 «Кислород» (Химия 7).
+ * Монтируются движком chem8_engine.js: window.CHEM8_WIDGETS[id] / window.FLAG_MOUNTS[id].
+ * Используют window.Chem8 (chem8_svg.js): chemEq, formula, molarMass, arOf.
+ * Без эмоджи; KaTeX-рендер — через window.chem8RenderMath.
+ */
+(function (W) {
+ 'use strict';
+ function C() { return W.Chem8 || {}; }
+ function $(id) { return document.getElementById(id); }
+ function esc(s){ return String(s).replace(/&/g,'&').replace(//g,'>'); }
+ function gcd(a, b) { return b ? gcd(b, a % b) : a; }
+ function ceq(src, opts){ return C().chemEq ? C().chemEq(src, opts || {}) : esc(src); }
+
+ var COL = { H:'#cbd5e1', O:'#ef4444', N:'#3b82f6', C:'#334155', S:'#eab308', P:'#f97316', Fe:'#b45309', Mg:'#22c55e', Cu:'#ea580c' };
+ function ball(el, x, r){
+ return ''
+ + ''+el+'';
+ }
+ function molSvg(atoms){ // atoms: [['O',2]]
+ var list=[]; atoms.forEach(function(p){ for(var i=0;i
'+svg+'';
+ }
+
+ /* §13 — состав воздуха (стопочная полоса с кликом) */
+ var AIR = [
+ { g:'Азот N₂', p:78, c:'#3b82f6', note:'не поддерживает горение и дыхание' },
+ { g:'Кислород O₂', p:21, c:'#ef4444', note:'нужен для дыхания и горения' },
+ { g:'Другие газы (Ar, CO₂…)', p:1, c:'#94a3b8', note:'аргон, углекислый газ и др. — около 1 %' }
+ ];
+ function mount_p13() {
+ var m = $('p13-air'); if (!m || m._built) return; m._built = 1;
+ var bar = AIR.map(function (a, i) {
+ return '
' + a.p + '%
';
+ }).join('');
+ m.innerHTML = '
' + bar + '
'
+ + '
Кликни по части диаграммы, чтобы узнать о газе.
';
+ var out = $('p13-air-out');
+ m.querySelectorAll('.air-seg').forEach(function (s) {
+ s.addEventListener('click', function () {
+ var a = AIR[+s.dataset.i]; out.className = 'out ok';
+ out.innerHTML = '' + esc(a.g) + ' — около ' + a.p + ' % воздуха. ' + esc(a.note) + '.';
+ });
+ });
+ }
+
+ /* ЛО2 — выбор способа собирания газа */
+ var GASES = [
+ { g:'Кислород O₂', heavier:true, ways:['вытеснением воды', 'в сосуд отверстием вверх (тяжелее воздуха)'] },
+ { g:'Водород H₂', heavier:false, ways:['вытеснением воды', 'в сосуд отверстием вниз (легче воздуха)'] },
+ { g:'Углекислый газ CO₂', heavier:true, ways:['в сосуд отверстием вверх (тяжелее воздуха)'] }
+ ];
+ function mount_lo2() {
+ var m = $('lo2-coll'); if (!m || m._built) return; m._built = 1;
+ var idx = 0;
+ function render(){
+ var g = GASES[idx];
+ m.innerHTML = ''
+ + '
';
+ $('lo2-pick').addEventListener('change', function(e){ idx=+e.target.value; m._built=0; render(); });
+ }
+ render();
+ }
+
+ /* §14 — кислород: элемент или простое вещество + модели O₂ / O₃ */
+ function mount_p14() {
+ var m = $('p14-tog'); if (!m || m._built) return; m._built = 1;
+ var mode = 'el';
+ function render(){
+ m.innerHTML = '
'
+ + ''
+ + '
'
+ + '
' + (
+ mode==='el' ? 'Кислород — химический элемент (символ O, Z = 8, A_r = 16). Так говорят, когда речь о атомах кислорода в составе веществ (например, в воде H₂O).'
+ : mode==='o2' ? 'Кислород — простое вещество O₂: молекула из двух атомов. Газ без цвета и запаха, немного тяжелее воздуха.' + molSvg([['O',2]])
+ : 'Озон O₃: молекула из трёх атомов кислорода — другое простое вещество того же элемента.' + molSvg([['O',3]])
+ ) + '
Из каких газов состоит воздух и почему он так важен.
'
+ +'
смесь$N_2$$O_2$
'
+ +makeCard('theory','Состав воздуха','§13','
Воздух — это смесь газов. Основные из них: азот $\\text{N}_2$ (около 78 %) и кислород $\\text{O}_2$ (около 21 %). Ещё около 1 % приходится на другие газы — аргон, углекислый газ и др.
'
+ +'
Воздух — однородная смесь: газы перемешаны равномерно. Именно кислород воздуха обеспечивает дыхание живых организмов и горение.
')
+ +wgt('Состав воздуха: кликни по части диаграммы','')
+ +rememberBox(['Воздух — смесь газов.','Азота ≈ 78 %, кислорода ≈ 21 %.','Кислород нужен для дыхания и горения.'])
+ +qList(['Из каких газов в основном состоит воздух?','Какова доля кислорода в воздухе?','Почему воздух называют смесью, а не чистым веществом?'])
+ +secNav(null,'lo2')+readButton('p13');
+ wireReadBtn('p13');
+}
+
+function build_lo2(){
+ document.getElementById('lo2-body').innerHTML =
+ '
Лабораторный опыт 2
Сборка простейших приборов для получения и собирания газов
'
+ +'
Научиться собирать прибор для получения газа и выбирать способ его собирания.
'
+ +makeCard('lab','Прибор и способы собирания',null,'
Простейший прибор: пробирка с пробкой и газоотводной трубкой. Газ из пробирки по трубке поступает в сосуд для собирания.
'
+ +'
Вытеснением воздуха. Газ тяжелее воздуха ($O_2$, $CO_2$) собирают в сосуд, держа его отверстием вверх; легче воздуха ($H_2$) — отверстием вниз.
Вытеснением воды. Так собирают газы, мало растворимые в воде (например, кислород).
'
+ +'
Проверь герметичность прибора перед опытом; нагревай пробирку осторожно.
Кислород как химический элемент и простое вещество
'
+ +'
Чем отличается элемент кислород от простого вещества кислород.
'
+ +'
$O$$O_2$$O_3$
'
+ +makeCard('theory','Элемент и простое вещество','§14','
Кислород как элемент — это атомы O ($Z=8$, $A_r=16$). Они входят в состав очень многих веществ (воды $\\text{H}_2\\text{O}$, оксидов, песка $\\text{SiO}_2$). Кислород — самый распространённый элемент земной коры.
'
+ +'
Кислород как простое вещество — это газ $\\text{O}_2$ (молекула из двух атомов). Элемент кислород образует и другое простое вещество — озон $\\text{O}_3$.
')
+ +makeCard('theory','Физические свойства кислорода','§14','
$\\text{O}_2$ — газ без цвета и запаха, немного тяжелее воздуха, мало растворим в воде. При сильном охлаждении превращается в голубоватую жидкость.
')
+ +wgt('Элемент O или простое вещество?','')
+ +rememberBox(['Элемент кислород — атомы O в составе веществ.','Простое вещество — газ $O_2$.','Озон $O_3$ — другое простое вещество того же элемента.'])
+ +qList(['Когда говорят о кислороде-элементе, а когда — о простом веществе?','Назови физические свойства кислорода $O_2$.','Чем озон отличается от кислорода?'])
+ +secNav('lo2','p15')+readButton('p14');
+ wireReadBtn('p14');
+}
+
+function build_p15(){
+ document.getElementById('p15-body').innerHTML =
+ '
§ 15 · Химия 7
Химические свойства кислорода
'
+ +'
вещество $+ \\text{O}_2 \\to$ оксид
'
+ +'
Как кислород реагирует с другими веществами и что такое горение и окисление.
'
+ +'
горениеоксидокисление
'
+ +makeCard('theory','Кислород — активное вещество','§15','
Кислород реагирует со многими простыми и сложными веществами. Реакции, идущие с выделением тепла и света, называют горением. Продукты горения простых веществ в кислороде — оксиды.
'
+ +'
Окисление — реакция вещества с кислородом. Оно бывает быстрым (горение) и медленным (дыхание, гниение, ржавление железа).
')
+ +makeCard('example','Горение веществ в кислороде',null,'
')
+ +wgt('Симулятор горения в кислороде','')
+ +rememberBox(['Горение — реакция с кислородом, идёт с выделением тепла и света.','Продукт горения простого вещества — оксид.','Окисление бывает быстрым (горение) и медленным.'])
+ +qList(['Что образуется при горении вещества в кислороде?','Приведи пример медленного окисления.','Запиши уравнение горения углерода.'])
+ +secNav('p14','p16')+readButton('p15');
+ wireReadBtn('p15');
+}
+
+/* заглушки для ещё не наполненных § (следующая волна) */
(function(){
var P = window.PARAS, B = {};
function ph(p, prev, next){
@@ -102,7 +205,7 @@ window.TIPS = [{ sec:'p13', html:'Глава наполняется содерж
'
' + p.num + ' · Химия 7
' + p.name + '
'
+ '
Содержание этого ' + (p.final ? 'раздела' : 'параграфа') + ' готовится.
'
+ makeCard('theory', p.name, p.num,
- '
Скоро здесь появятся теория, наглядные SVG-схемы, молекулярные модели и интерактивные тренажёры по теме «' + p.name + '». Пока доступна навигация по главе' + (p.final ? '.' : ' и отметка о прочтении.') + '
')
+ '
Скоро здесь появятся теория, наглядные SVG-схемы и интерактивные тренажёры по теме «' + p.name + '». Пока доступна навигация по главе' + (p.final ? '.' : ' и отметка о прочтении.') + '