Align the project baseline with the latest admin interface styling and layout structure while documenting setup and usage updates in README.
111 lines
4.8 KiB
JavaScript
111 lines
4.8 KiB
JavaScript
(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 });
|
|
});
|
|
}
|
|
|
|
})(); |