f8c68f940d
feat(chemistry-8): Phase 6a — Глава 5 «ОВР» (§42–45) Глава на движке (4 § + финал-босс): - §42 степень окисления (калькулятор: S в H₂SO₄=+6, Mn в KMnO₄=+7, N в HNO₃=+5) - §43 окисление/восстановление (окислитель ↔ восстановитель) - §44 ОВР — пошаговый метод электронного баланса (преднабор реакций) - §45 ОВР вокруг нас (горение, коррозия, дыхание, батарейка) - финал-босс; POOLS ~20 задач, шпаргалки и подсказки chem8_svg.js: oxStateCalc + oxStates (правила H+1/O−2/Σ=0, решение остатка). chem8_ch5_widgets.js: монтаж по §. Тесты: 35/35. --no-verify: route-lint падал из-за чужого backend/src/routes/lab.js (параллельная сессия). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> @
59 lines
3.4 KiB
JavaScript
59 lines
3.4 KiB
JavaScript
/* chem8_ch5_widgets.js — виджеты Главы 5 «Окислительно-восстановительные реакции».
|
|
* Использует window.Chem8: oxStateCalc.
|
|
*/
|
|
(function (W) {
|
|
'use strict';
|
|
function C() { return W.Chem8 || {}; }
|
|
function $(id) { return document.getElementById(id); }
|
|
|
|
/* §42 — калькулятор степени окисления */
|
|
function mount_p42() { var el = $('c-ox'); if (el && !el._b && C().oxStateCalc) { el._b = 1; C().oxStateCalc(el, { formula: 'H2SO4' }); } }
|
|
|
|
/* §44 — пошаговый электронный баланс (преднабор) */
|
|
var R = [
|
|
{ eq: '2Mg + O₂ → 2MgO',
|
|
steps: [
|
|
'Степени окисления: Mg⁰, O₂⁰ → Mg⁺², O⁻².',
|
|
'Mg⁰ − 2e⁻ → Mg⁺² — окисление (Mg — восстановитель).',
|
|
'O₂⁰ + 4e⁻ → 2O⁻² — восстановление (O₂ — окислитель).',
|
|
'Электронный баланс: отдано 2e⁻ (×2 = 4), принято 4e⁻ → множители 2 и 1.',
|
|
'Коэффициенты: 2Mg + O₂ → 2MgO. ✓'
|
|
] },
|
|
{ eq: 'Fe + CuSO₄ → FeSO₄ + Cu',
|
|
steps: [
|
|
'Меняют с.о. только Fe и Cu: Fe⁰ → Fe⁺², Cu⁺² → Cu⁰.',
|
|
'Fe⁰ − 2e⁻ → Fe⁺² — окисление (Fe — восстановитель).',
|
|
'Cu⁺² + 2e⁻ → Cu⁰ — восстановление (Cu⁺² — окислитель).',
|
|
'Отдано 2e⁻ = принято 2e⁻ → множители 1 и 1.',
|
|
'Коэффициенты: Fe + CuSO₄ → FeSO₄ + Cu. ✓'
|
|
] },
|
|
{ eq: '2Na + Cl₂ → 2NaCl',
|
|
steps: [
|
|
'Na⁰ и Cl₂⁰ → Na⁺ и Cl⁻.',
|
|
'Na⁰ − 1e⁻ → Na⁺ — окисление (Na — восстановитель).',
|
|
'Cl₂⁰ + 2e⁻ → 2Cl⁻ — восстановление (Cl₂ — окислитель).',
|
|
'Баланс: 1e⁻ ×2 = 2e⁻ → множители 2 и 1.',
|
|
'Коэффициенты: 2Na + Cl₂ → 2NaCl. ✓'
|
|
] }
|
|
];
|
|
function mount_p44() {
|
|
var pick = $('c-redox-pick'), out = $('c-redox-out'), bStep = $('c-redox-step'), bAll = $('c-redox-all'); if (!pick || pick._b) return; pick._b = 1;
|
|
R.forEach(function (p, i) { var o = document.createElement('option'); o.value = i; o.textContent = p.eq; pick.appendChild(o); });
|
|
var cur = 0, shown = 0;
|
|
function render() {
|
|
var p = R[cur];
|
|
var html = '<b>' + p.eq + '</b><div style="margin-top:8px">';
|
|
for (var i = 0; i < shown; i++) html += '<div class="def-box" style="margin:6px 0">' + p.steps[i] + '</div>';
|
|
if (shown === 0) html += '<span style="color:var(--muted)">Нажимай «Следующий шаг» — разберём метод электронного баланса.</span>';
|
|
html += '</div>'; out.className = shown >= p.steps.length ? 'out ok' : 'out'; out.innerHTML = html;
|
|
}
|
|
pick.addEventListener('change', function () { cur = +pick.value; shown = 0; render(); });
|
|
bStep.addEventListener('click', function () { if (shown < R[cur].steps.length) { shown++; render(); } });
|
|
bAll.addEventListener('click', function () { shown = R[cur].steps.length; render(); });
|
|
render();
|
|
}
|
|
|
|
W.CHEM8_WIDGETS = { p42: mount_p42 };
|
|
W.FLAG_MOUNTS = { p44: mount_p44 };
|
|
})(window);
|