Spaces:
Running
Running
| // Exemine Minecraft Server Website JavaScript | |
| document.addEventListener('DOMContentLoaded', function() { | |
| // Initialize feather icons | |
| if (typeof feather !== 'undefined') { | |
| feather.replace(); | |
| } | |
| // Server status check | |
| const serverStatus = { | |
| checkStatus: async function() { | |
| try { | |
| // Simulate server status check (replace with actual API call) | |
| const response = await fetch('/api/server-status'); | |
| const data = await response.json(); | |
| this.updateStatus(data); | |
| } catch (error) { | |
| console.log('Server status check failed, using demo data'); | |
| // Demo data for demonstration | |
| this.updateStatus({ | |
| online: true, | |
| players: 24, | |
| maxPlayers: 32, | |
| version: '1.20.1' | |
| }); | |
| } | |
| }, | |
| updateStatus: function(data) { | |
| const statusElement = document.querySelector('.text-green-400'); | |
| const playersElement = document.querySelector('.text-2xl.font-bold.text-primary-500'); | |
| const versionElement = document.querySelector('.text-lg'); | |
| if (statusElement) { | |
| statusElement.textContent = data.online ? 'Онлайн' : 'Офлайн'; | |
| } | |
| if (playersElement) { | |
| playersElement.textContent = `${data.players}/${data.maxPlayers}`; | |
| } | |
| if (versionElement) { | |
| versionElement.textContent = data.version; | |
| } | |
| } | |
| }; | |
| // Copy server IP functionality | |
| const copyButton = document.querySelector('button'); | |
| if (copyButton && copyButton.textContent.includes('Скопировать')) { | |
| copyButton.addEventListener('click', function() { | |
| const serverIP = 'exemine.mc-server.ru'; | |
| navigator.clipboard.writeText(serverIP).then(() => { | |
| const originalText = this.textContent; | |
| this.textContent = 'Скопировано!'; | |
| this.classList.add('bg-green-600'); | |
| this.classList.remove('bg-primary-600', 'hover:bg-primary-700'); | |
| setTimeout(() => { | |
| this.textContent = originalText; | |
| this.classList.remove('bg-green-600'); | |
| this.classList.add('bg-primary-600', 'hover:bg-primary-700'); | |
| }, 2000); | |
| }).catch(() => { | |
| // Fallback for older browsers | |
| const textArea = document.createElement('textarea'); | |
| textArea.value = serverIP; | |
| document.body.appendChild(textArea); | |
| textArea.select(); | |
| document.execCommand('copy'); | |
| document.body.removeChild(textArea); | |
| const originalText = this.textContent; | |
| this.textContent = 'Скопировано!'; | |
| this.classList.add('bg-green-600'); | |
| this.classList.remove('bg-primary-600', 'hover:bg-primary-700'); | |
| setTimeout(() => { | |
| this.textContent = originalText; | |
| this.classList.remove('bg-green-600'); | |
| this.classList.add('bg-primary-600', 'hover:bg-primary-700'); | |
| }, 2000); | |
| }); | |
| }); | |
| } | |
| // Smooth scroll for navigation links | |
| document.querySelectorAll('a[href^="#"]').forEach(anchor => { | |
| anchor.addEventListener('click', function (e) { | |
| e.preventDefault(); | |
| const target = document.querySelector(this.getAttribute('href')); | |
| if (target) { | |
| target.scrollIntoView({ | |
| behavior: 'smooth', | |
| block: 'start' | |
| }); | |
| } | |
| }); | |
| }); | |
| // Navbar background on scroll | |
| window.addEventListener('scroll', function() { | |
| const navbar = document.querySelector('nav'); | |
| if (window.scrollY > 100) { | |
| navbar.classList.add('bg-gray-800', 'bg-opacity-95'); | |
| navbar.classList.remove('bg-gray-800'); | |
| } else { | |
| navbar.classList.remove('bg-opacity-95'); | |
| navbar.classList.add('bg-gray-800'); | |
| } | |
| }); | |
| // Animate elements on scroll | |
| const observerOptions = { | |
| threshold: 0.1, | |
| rootMargin: '0px 0px -50px 0px' | |
| }; | |
| const observer = new IntersectionObserver(function(entries) { | |
| entries.forEach(entry => { | |
| if (entry.isIntersecting) { | |
| entry.target.classList.add('animate-fade-in'); | |
| } | |
| }); | |
| }, observerOptions); | |
| // Observe elements for animation | |
| document.querySelectorAll('.bg-gray-800, .bg-gray-900').forEach(el => { | |
| el.classList.add('opacity-0', 'transform', 'translate-y-4', 'transition', 'duration-700'); | |
| observer.observe(el); | |
| }); | |
| // Add CSS for fade-in animation | |
| const style = document.createElement('style'); | |
| style.textContent = ` | |
| .animate-fade-in { | |
| opacity: 1 !important; | |
| transform: translateY(0) !important; | |
| } | |
| `; | |
| document.head.appendChild(style); | |
| // Player counter animation | |
| function animateCounter(element, target) { | |
| let current = 0; | |
| const increment = target / 50; | |
| const timer = setInterval(() => { | |
| current += increment; | |
| if (current >= target) { | |
| current = target; | |
| clearInterval(timer); | |
| } | |
| element.textContent = Math.floor(current) + '/32'; | |
| }, 30); | |
| } | |
| // Handle main action buttons | |
| document.querySelectorAll('button').forEach(button => { | |
| button.addEventListener('click', function(e) { | |
| // Add click effect | |
| const ripple = document.createElement('span'); | |
| ripple.classList.add('absolute', 'bg-white', 'opacity-25', 'rounded-full', 'animate-ping'); | |
| const rect = this.getBoundingClientRect(); | |
| const size = Math.max(rect.width, rect.height); | |
| ripple.style.width = size + 'px'; | |
| ripple.style.height = size + 'px'; | |
| ripple.style.left = (e.clientX - rect.left - size / 2) + 'px'; | |
| ripple.style.top = (e.clientY - rect.top - size / 2) + 'px'; | |
| this.style.position = 'relative'; | |
| this.style.overflow = 'hidden'; | |
| this.appendChild(ripple); | |
| setTimeout(() => { | |
| ripple.remove(); | |
| }, 600); | |
| }); | |
| }); | |
| // Initialize server status check | |
| serverStatus.checkStatus(); | |
| // Add typing effect to hero text | |
| const heroTitle = document.querySelector('h1'); | |
| if (heroTitle && heroTitle.textContent.includes('Exemine')) { | |
| const originalText = heroTitle.textContent; | |
| heroTitle.textContent = ''; | |
| let i = 0; | |
| const typeWriter = () => { | |
| if (i < originalText.length) { | |
| heroTitle.textContent += originalText.charAt(i); | |
| i++; | |
| setTimeout(typeWriter, 100); | |
| } | |
| }; | |
| setTimeout(typeWriter, 500); | |
| } | |
| // Add hover effects to feature cards | |
| document.querySelectorAll('.bg-gray-800').forEach(card => { | |
| if (card.querySelector('h3')) { | |
| card.classList.add('card-hover', 'cursor-pointer'); | |
| card.addEventListener('mouseenter', function() { | |
| this.style.transform = 'translateY(-5px)'; | |
| this.style.boxShadow = '0 20px 40px rgba(0, 0, 0, 0.3)'; | |
| }); | |
| card.addEventListener('mouseleave', function() { | |
| this.style.transform = 'translateY(0)'; | |
| this.style.boxShadow = 'none'; | |
| }); | |
| } | |
| }); | |
| // Add mobile menu toggle (if needed) | |
| const mobileMenuButton = document.querySelector('.md\\:hidden button'); | |
| const mobileMenu = document.querySelector('.md\\:block'); | |
| if (mobileMenuButton && mobileMenu) { | |
| mobileMenuButton.addEventListener('click', function() { | |
| mobileMenu.classList.toggle('hidden'); | |
| }); | |
| } | |
| // Performance monitoring | |
| console.log('Exemine website loaded successfully'); | |
| console.log('Features loaded:', document.querySelectorAll('.bg-gray-800').length); | |
| }); | |
| // Service Worker registration for PWA capabilities (optional) | |
| if ('serviceWorker' in navigator) { | |
| window.addEventListener('load', function() { | |
| navigator.serviceWorker.register('/sw.js') | |
| .then(function(registration) { | |
| console.log('ServiceWorker registration successful'); | |
| }, function(err) { | |
| console.log('ServiceWorker registration failed'); | |
| }); | |
| }); | |
| } |