mod: ядро (03) уменьшены максимальные значения "плотности галлюцинации" т.к. браузер большую сетку может не тянуть...

This commit is contained in:
2026-08-23 22:56:58 +03:00
parent 4917e04e5a
commit 3128ae4e2d
3 changed files with 20 additions and 7 deletions
+3 -3
View File
@@ -32,9 +32,9 @@ class HalftoneGenerateForm(forms.Form):
required=False,
)
cols = forms.IntegerField(
min_value=20,
max_value=200,
initial=80,
min_value=10,
max_value=80,
initial=35,
required=False,
)
max_radius = forms.IntegerField(
+13
View File
@@ -66,6 +66,19 @@ class HalftoneServiceTests(TestCase):
svg = generate_halftone_svg(buf.getvalue(), cols=20)
self.assertIn("<svg", svg)
def test_generate_aspect_ratios(self):
# Проверяем, что для вертикального изображения (100x300) сетка не раздувается
tall_img = Image.new("RGB", (100, 300), color="black")
svg_tall = generate_halftone_svg(tall_img, cols=30, max_radius=5)
# При cols=30 наибольшая сторона (высота) должна иметь 30 точек, а ширина 10
# step = 5 * 2 + 2 = 12 -> width = 10 * 12 = 120, height = 30 * 12 = 360
self.assertIn('viewBox="0 0 120 360"', svg_tall)
# Для горизонтального изображения (300x100)
wide_img = Image.new("RGB", (300, 100), color="black")
svg_wide = generate_halftone_svg(wide_img, cols=30, max_radius=5)
self.assertIn('viewBox="0 0 360 120"', svg_wide)
class HalftoneFormTests(TestCase):
"""Тестирование формы валидации HalftoneGenerateForm."""
+4 -4
View File
@@ -11,7 +11,7 @@
colors: ['#a855ff'],
/* Параметры сетки и трансформаций */
cols: 80, /* Плотность галлюцинации (число колонок сетки, 20-200) */
cols: 35, /* Плотность галлюцинации (число ячеек сетки по длинной стороне, 10-80) */
radius: 8, /* Размер гипно-точки (максимальный радиус элементов, 3-20) */
blink: 6, /* Интенсивность мерцания CSS-анимации (0-10) */
rotation: 0, /* Укачивание (угол поворота элементов, от -15° до +15°) */
@@ -292,12 +292,12 @@
<div class="flex justify-between mb-1">
<label class="text-xs font-bold text-stone-400 uppercase">Плотность галлюцинации</label>
<span class="text-xs transition-colors duration-300"
:class="cols >= 140 ? 'text-red-600' : (cols > 80 ? 'text-yellow-500' : 'text-emerald-600')"
:class="cols >= 60 ? 'text-red-600' : (cols > 50 ? 'text-yellow-500' : 'text-emerald-600')"
x-text="cols"></span>
</div>
<input type="range" name="cols" min="20" max="200" x-model="cols"
<input type="range" name="cols" min="10" max="80" x-model="cols"
@input="$el.dispatchEvent(new CustomEvent('input-change'))"
:class="cols >= 140 ? 'accent-red-600' : (cols > 80 ? 'accent-yellow-500' : 'accent-emerald-500')"
:class="cols >= 60 ? 'accent-red-600' : (cols > 50 ? 'accent-yellow-500' : 'accent-emerald-500')"
class="w-full transition-all duration-300">
</div>
{# РАЗМЕР ЭЛЕМЕНТА #}<div>