feat(math6): полоса процента (Гл.2 §1) + фильтр множества (Гл.3 §1)

Math6Anim.barModel — полоса 0..100%, заполняется (easing) к проценту,
синхронно %↔десятичная↔дробь; вшита в §2.1 на тот же ползунок, что и сетка 100.
Math6Anim.setFilter — числа 1..12 по очереди проходят сквозь «фильтр свойства»
(чётные/кратные 3/больше 6), подходящие падают в множество; кнопки смены свойства;
вшита в §3.1. Теперь во ВСЕХ 6 главах есть canvas-анимации + stepPlayer везде.
Headless-safe. Тесты math6: 20/20.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-02 22:00:57 +03:00
parent 97966ba2df
commit 302b062649
4 changed files with 78 additions and 3 deletions
+10
View File
@@ -203,6 +203,16 @@ test('анимации: canvas-демо монтируются (headless-safe)',
r5.doc.defaultView.goTo('p1'); await wait(100);
assert.ok(r5.doc.querySelector('#p1-game canvas'), 'canvas «координатный тир» §5.1');
assert.deepEqual(r5.errors, [], 'ch5 без ошибок: ' + r5.errors.join(' | '));
// Глава 2 §1 — полоса процента
const r2 = await loadDom('math_6_ch2.html');
r2.doc.defaultView.goTo('p1'); await wait(100);
assert.ok(r2.doc.querySelector('#p1-bar canvas'), 'canvas «полоса процента» §2.1');
assert.deepEqual(r2.errors, [], 'ch2 без ошибок: ' + r2.errors.join(' | '));
// Глава 3 §1 — фильтр множества
const r3 = await loadDom('math_6_ch3.html');
r3.doc.defaultView.goTo('p1'); await wait(100);
assert.ok(r3.doc.querySelector('#p1-filterfig canvas'), 'canvas «фильтр множества» §3.1');
assert.deepEqual(r3.errors, [], 'ch3 без ошибок: ' + r3.errors.join(' | '));
});
test('stepPlayer: «Разбор по шагам» становится интерактивным плеером', async () => {