feat(math6): canvas-анимации — движок math6_anim.js + 3 флагмана

Новый headless-safe движок window.Math6Anim (по канве chem7_anim:
RAF-цикл с паузой вне экрана через IntersectionObserver, prefers-reduced-motion,
в jsdom/HeadlessChrome getContext НЕ вызывается → тесты не падают).
Демо: rollingCircle (колесо катится → путь = C=2πr=πd), sweepArea
(радиус заметает круг → S=πr²), areaModel (площадная модель умножения a·b
на сетке 0,1). Вшито: Гл.6 §2 (колесо + заметание), Гл.1 §6 (умножение).
Тесты math6: 19/19 (+canvas-демо монтируются headless-safe).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-02 21:24:37 +03:00
parent 85c516e811
commit 6b734957e9
4 changed files with 212 additions and 3 deletions
+15
View File
@@ -20,6 +20,7 @@ function buildPage(file) {
let html = readF('frontend/textbooks/' + file);
const inl = {
'/js/math6_svg.js': readF('frontend/js/math6_svg.js'),
'/js/math6_anim.js': readF('frontend/js/math6_anim.js'),
'/js/math6_engine.js': readF('frontend/js/math6_engine.js')
};
html = html
@@ -167,6 +168,20 @@ test('ch6: наглядная геометрия — интерактивы §1
assert.deepEqual(errors, [], 'нет ошибок: ' + errors.join(' | '));
});
test('анимации: canvas-демо монтируются (headless-safe)', async () => {
// Глава 6 §2: колесо + заметание площади
const r6 = await loadDom('math_6_ch6.html');
r6.doc.defaultView.goTo('p2'); await wait(100);
assert.ok(r6.doc.querySelector('#p2-roll canvas'), 'canvas «колесо» §6.2');
assert.ok(r6.doc.querySelector('#p2-sweep canvas'), 'canvas «заметание площади» §6.2');
assert.deepEqual(r6.errors, [], 'ch6 без ошибок: ' + r6.errors.join(' | '));
// Глава 1 §6: площадная модель умножения
const r1 = await loadDom('math_6_ch1.html');
r1.doc.defaultView.goTo('p6'); await wait(100);
assert.ok(r1.doc.querySelector('#p6-area canvas'), 'canvas «площадная модель» §1.6');
assert.deepEqual(r1.errors, [], 'ch1 без ошибок: ' + r1.errors.join(' | '));
});
test('hub: 6 карточек глав + курсовой финал', async () => {
const { doc, errors } = await loadDom('math_6_hub.html');
assert.deepEqual(errors, [], 'нет ошибок: ' + errors.join(' | '));