From 1c2d0de14ce6cba4224d09165b0a600c43ab0042 Mon Sep 17 00:00:00 2001 From: erjemin Date: Mon, 14 Sep 2026 20:56:43 +0300 Subject: [PATCH] =?UTF-8?q?add:=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20(2)?= =?UTF-8?q?=20404?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hypn0/hypn0_site/tests.py | 2 +- hypn0/templates/_error/404.html | 39 +++++++++++++++++---------------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/hypn0/hypn0_site/tests.py b/hypn0/hypn0_site/tests.py index dbad9ef..8e3f613 100644 --- a/hypn0/hypn0_site/tests.py +++ b/hypn0/hypn0_site/tests.py @@ -1434,7 +1434,7 @@ class BlogPostModelAndAdminTests(BaseMediaTestCase): self.assertContains(response, "Гипноузел не обнаружен", status_code=404) self.assertContains(response, "СБОЙ МАТРИЦЫ // КОД? 404", status_code=404) self.assertContains(response, "return-btn", status_code=404) - self.assertContains(response, "Стираем остатки несущес­твующей страницы", status_code=404) + self.assertContains(response, "Стираем остатки несущес­твующей страницы", status_code=404) @override_settings(DEBUG=True) def test_debug_error_preview_routing(self): diff --git a/hypn0/templates/_error/404.html b/hypn0/templates/_error/404.html index 3a10d16..ed12262 100644 --- a/hypn0/templates/_error/404.html +++ b/hypn0/templates/_error/404.html @@ -4,7 +4,7 @@ 404 — Векторная реальность не найдена | HypnoSVG - + @@ -29,12 +29,10 @@ --text-dim: #9ca3af; --border-color: #d1d5db; --accent-color: #059669; - --accent-hover: #047857; --accent-bg: #ecfdf5; --btn-bg: #059669; --btn-text: #ffffff; --btn-hover: #047857; - --glitch-color: #dc2626; --progress-bg: #e5e7eb; --progress-fill: #059669; } @@ -48,12 +46,10 @@ --text-dim: #71717a; --border-color: #27272a; --accent-color: #a3e635; - --accent-hover: #bef264; --accent-bg: #14280f; --btn-bg: #a3e635; --btn-text: #09090b; --btn-hover: #bef264; - --glitch-color: #f87171; --progress-bg: #27272a; --progress-fill: #a3e635; } @@ -149,23 +145,28 @@ } .error-art { - width: 300px; + width: min(300px, 100%); height: 300px; margin: 0 auto 1.5rem; - display: flex; - /* align-items: center; - justify-content: center; */ } .error-art img, .error-art svg { width: 100%; height: 100%; object-fit: contain; + animation: spin-spiral 40s linear infinite; + transform-origin: center center; } - @keyframes pulse-art { - 0%, 100% { transform: scale(1) rotate(0deg); } - 50% { transform: scale(1.05) rotate(-2deg); } + @keyframes spin-spiral { + from { transform: rotate(0deg); } + to { transform: rotate(-360deg); } + } + + @media (prefers-reduced-motion: reduce) { + .error-art img, .error-art svg { + animation: none; + } } .error-code-badge { @@ -240,7 +241,7 @@ gap: 0.5rem; text-decoration: none; transition: all 0.2s ease; - min-width: 16rem; + min-width: min(16rem, 100%); } .btn-primary { @@ -408,7 +409,7 @@ @@ -437,10 +438,10 @@ var isCalibrating = false; var phrases = [ - { at: 0, text: "✦ Фаза 1/4: Стираем остатки несущес­твующей страницы из подсознания…" }, - { at: 25, text: "✦ Фаза 2/4: Бюрократ 24-го уровня заверяет протокол 404…" }, - { at: 55, text: "✦ Фаза 3/4: Синхронизируем частоту мерцания с перцеп­торным полем…" }, - { at: 85, text: "✦ Фаза 4/4: Внушение принято! Телепор­тация на главную…" } + { at: 0, text: "✦ Фаза 1/4: Стираем остатки несущес­твующей страницы из подсознания…" }, + { at: 25, text: "✦ Фаза 2/4: Бюрократ 24-го уровня заверяет протокол 404…" }, + { at: 55, text: "✦ Фаза 3/4: Синхронизируем частоту мерцания с перцеп­торным полем…" }, + { at: 85, text: "✦ Фаза 4/4: Внушение принято! Телепор­тация на главную…" } ]; returnBtn.addEventListener('click', function() { @@ -464,7 +465,7 @@ // Подбираем актуальную смешную фразу for (var i = phrases.length - 1; i >= 0; i--) { if (progress >= phrases[i].at) { - calibStatus.textContent = phrases[i].text; + calibStatus.innerHTML = phrases[i].text; break; } }