Update admin theme/layout and refresh README details.

Align the project baseline with the latest admin interface styling and layout structure while documenting setup and usage updates in README.
This commit is contained in:
vlad
2026-07-14 17:12:28 +03:00
commit 86cc3fa541
278 changed files with 19416 additions and 0 deletions
+111
View File
@@ -0,0 +1,111 @@
(function() {
'use strict';
// ===== SCRAMBLE HERO =====
const heroTitleEl = document.getElementById('heroTitle');
if (heroTitleEl) {
const originalText = heroTitleEl.textContent.trim() || 'Технологии будущего на вашей ферме';
const chars = '!@#$%^&*()_+{}[]|;:,.<>?';
let iteration = 0;
let isScrambling = true;
let frameId = null;
const maxIterations = 30;
function scramble() {
if (!isScrambling) return;
const result = originalText
.split('')
.map((char, index) => {
if (index < iteration) return originalText[index];
if (char === ' ') return ' ';
return chars[Math.floor(Math.random() * chars.length)];
})
.join('');
heroTitleEl.textContent = result;
iteration += 1;
if (iteration <= maxIterations) {
frameId = requestAnimationFrame(scramble);
} else {
heroTitleEl.textContent = originalText;
isScrambling = false;
if (frameId) {
cancelAnimationFrame(frameId);
frameId = null;
}
}
}
setTimeout(() => {
scramble();
}, 300);
}
// ===== FADE-UP =====
const fadeElements = document.querySelectorAll('.fade-up');
if (fadeElements.length > 0 && 'IntersectionObserver' in window) {
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
observer.unobserve(entry.target);
}
});
}, { threshold: 0.15, rootMargin: '0px 0px -30px 0px' });
fadeElements.forEach(el => observer.observe(el));
} else {
fadeElements.forEach(el => el.classList.add('visible'));
}
// ===== EXPAND BLOCK =====
const expandContent = document.getElementById('expandContent');
if (expandContent && 'IntersectionObserver' in window) {
let isExpanded = false;
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
if (!isExpanded) {
expandContent.classList.add('expanded');
isExpanded = true;
}
} else {
if (isExpanded) {
expandContent.classList.remove('expanded');
isExpanded = false;
}
}
});
}, { threshold: 0.25, rootMargin: '0px 0px -30px 0px' });
observer.observe(expandContent);
} else if (expandContent) {
expandContent.classList.add('expanded');
}
// ===== MARQUEE =====
const marqueeTrack = document.getElementById('marqueeTrack');
const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)');
if (prefersReducedMotion.matches && marqueeTrack) {
marqueeTrack.style.animation = 'none';
marqueeTrack.style.transform = 'translateX(0)';
}
prefersReducedMotion.addEventListener('change', (e) => {
if (marqueeTrack) {
if (e.matches) {
marqueeTrack.style.animation = 'none';
marqueeTrack.style.transform = 'translateX(0)';
} else {
marqueeTrack.style.animation = 'marqueeScroll 30s linear infinite';
marqueeTrack.style.transform = '';
}
}
});
// ===== HERO VIDEO =====
const heroVideo = document.querySelector('.hero-video');
if (heroVideo) {
heroVideo.play().catch(() => {
document.addEventListener('click', () => {
heroVideo.play();
}, { once: true });
});
}
})();