-
Nikitos создал
Пробел из docs/TASKS.md §1.6: рампы были зашиты в частицах, градиентный помощник приватен в render.js, общей интерполяции не было — каждый модуль писал свою формулу затухания. * make()/define()/use()/names(): кривая значений — функция (t) => y с методами at (зажим t), range (равномерные сэмплы), points, plus; * четыре режима: linear, step (ступенька), smooth и spline (Catmull-Rom); сплайн считает по значениям, а не по индексам, поэтому неровные по x точки остаются плавными; * встроенные кривые: linear, easeIn/Out/InOut, pop, bounce, pulse, spike, fadeIn/fadeOut; любая принимается там, где ждут ease (проверено на $.tween); * gradient(): стопы строкой '#a → #b → #c' (стрелка — '→', '->' или '=>'), массивом цветов, объектами {at, color} и парами; интерполяция покомпонентная, а не в sRGB, поэтому тёмные цвета не выцветают в серое; * resolve(value): функция, число или имя → функция; разбор цветов (#rgb/#rrggbb/#rrggbbaa/rgb()/transparent/число) вынесен в чистую часть. Тест нашёл настоящий баг: gradient() принимал только массив и игнорировал строку со стрелками ('#a → #b'), то есть документированный способ задания градиента не работал. Проверка: tests/js/curve_test.mjs (13 проверок чистых функций), tests/agent/highlevel_curve_test.py (8 проверок: реестр, ease в твине, градиент), полный набор qjs и агентских тестов зелёный.5479ba90