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; } }