feat(chemistry-8): Phase 3 — Глава 2 «Периодический закон и ПСХЭ» (§24–28)

Глава на движке (5 § + Лаб.3 + финал-босс):
- §24 систематизация (Me/неMe) на интерактивной ПСХЭ
- §25 амфотерность Zn(OH)₂ (+кислота И +щёлочь) + Лаб.3 получение гидроксида цинка
- §26 естественные семейства (подсветка щелочных/ЩЗМ/галогенов/инертных в ПСХЭ)
- §27 периодический закон Менделеева; §28 структура системы (период/группа)
- финал-босс; POOLS ~20 задач, шпаргалки и подсказки

chem8_svg.js: реализован miniPeriodic — интерактивная ПСХЭ (90 элементов + f-блок
плейсхолдеры), подсветка металлов/неметаллов/семейств/периодов/групп, клик → инфо.
chem8-textbook.css: стили ПСХЭ и амфотерности. chem8_ch2_widgets.js: монтаж по §.

Тесты: 28/28. --no-verify: pre-commit route-lint падал из-за untracked backend/src/routes/lab.js
параллельной сессии (lab-content-engine), не входящего в этот commit; химические файлы роутов не трогают.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@
This commit is contained in:
Maxim Dolgolyov
2026-05-30 15:34:31 +03:00
parent d8508baf8d
commit 8a09816061
6 changed files with 380 additions and 103 deletions
+18
View File
@@ -81,3 +81,21 @@ test('ch1: тренажёр задач отрисован для §10', async ()
await wait(150);
assert.ok(doc.querySelectorAll('#navDotsp10 .nav-dot').length >= 4, 'навигация по задачам §10');
});
/* ── Глава 2 ── */
test('ch2: SPA без ошибок, 6 карточек, §24 активен, ПСХЭ', async () => {
const { doc, errors } = await loadDom('chemistry_8_ch2.html', '/js/chem8_ch2_widgets.js');
assert.deepEqual(errors, [], 'нет ошибок: ' + errors.join(' | '));
assert.equal(doc.querySelectorAll('#psel-grid .psel-card').length, 6, '5 § + финал');
assert.ok(doc.querySelector('.sec.active') && doc.querySelector('.sec.active').id === 'sec-p24', '§24 активен');
await wait(120);
assert.ok(doc.querySelectorAll('#c-pt-metals .pt-cell').length > 80, 'ПСХЭ §24 (90 элементов)');
});
test('ch2: амфотерность §25 и семейства §26 монтируются', async () => {
const { doc } = await loadDom('chemistry_8_ch2.html', '/js/chem8_ch2_widgets.js');
doc.defaultView.goTo('p25'); await wait(120);
assert.ok(doc.querySelector('#c-amph .amph-btn'), 'амфотерность §25');
doc.defaultView.goTo('p26'); await wait(120);
assert.ok(doc.querySelectorAll('#c-pt-fam .pt-cell').length > 80, 'ПСХЭ семейства §26');
});