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