argobox-portfolio/script.js

148 lines
5.5 KiB
JavaScript

/**
* Main JavaScript file for argobox.com
* Handles navigation, animations, and interactivity
*/
document.addEventListener('DOMContentLoaded', function() {
// Update current year in footer
document.getElementById('current-year').textContent = new Date().getFullYear();
// Mobile menu toggle
const menuToggle = document.querySelector('.menu-toggle');
const navMenu = document.querySelector('.nav-menu');
if (menuToggle && navMenu) {
menuToggle.addEventListener('click', function() {
navMenu.classList.toggle('active');
});
}
// Active navigation link based on scroll position
const sections = document.querySelectorAll('section');
const navLinks = document.querySelectorAll('.nav-link');
function updateActiveLink() {
let currentSection = '';
sections.forEach(section => {
const sectionTop = section.offsetTop - 100;
const sectionHeight = section.offsetHeight;
if (window.scrollY >= sectionTop && window.scrollY < sectionTop + sectionHeight) {
currentSection = section.getAttribute('id');
}
});
navLinks.forEach(link => {
link.classList.remove('active');
if (link.getAttribute('href') === `#${currentSection}`) {
link.classList.add('active');
}
});
}
window.addEventListener('scroll', updateActiveLink);
updateActiveLink();
// Form submission handling
const contactForm = document.getElementById('contact-form');
if (contactForm) {
contactForm.addEventListener('submit', function(e) {
e.preventDefault();
// In a real implementation, you would send the form data to a backend service
// For now, we'll just simulate a successful submission
const formData = new FormData(contactForm);
const formValues = Object.fromEntries(formData.entries());
console.log('Form submission:', formValues);
// Show success message (in a real implementation)
alert('Thank you for your message! I will get back to you soon.');
// Reset form
contactForm.reset();
});
}
// Create animated data streams
function createRandomDataLines() {
const dataStreamContainer = document.querySelector('.data-stream');
if (!dataStreamContainer) return;
// Remove existing lines
const existingLines = dataStreamContainer.querySelectorAll('.data-line');
existingLines.forEach(line => line.remove());
// Create new random lines
for (let i = 0; i < 10; i++) {
const line = document.createElement('div');
line.classList.add('data-line');
// Random positioning and animation
const left = Math.random() * 90 + 5; // 5-95%
const width = Math.random() * 40 + 10; // 10-50%
const duration = Math.random() * 3 + 2; // 2-5s
line.style.left = `${left}%`;
line.style.width = `${width}%`;
line.style.animationDuration = `${duration}s`;
dataStreamContainer.appendChild(line);
}
}
// Initial data lines creation
createRandomDataLines();
// Refresh data lines periodically
setInterval(createRandomDataLines, 10000);
// Simulated live metrics - randomly update values periodically
function updateMetrics() {
const cpuValue = document.querySelector('.metric:nth-child(1) .metric-value');
const cpuBar = document.querySelector('.metric:nth-child(1) .metric-progress');
const memValue = document.querySelector('.metric:nth-child(2) .metric-value');
const memBar = document.querySelector('.metric:nth-child(2) .metric-progress');
const storageValue = document.querySelector('.metric:nth-child(3) .metric-value');
const storageBar = document.querySelector('.metric:nth-child(3) .metric-progress');
const networkValue = document.querySelector('.metric:nth-child(4) .metric-value');
const networkBar = document.querySelector('.metric:nth-child(4) .metric-progress');
if (cpuValue && cpuBar) {
const newCpuValue = Math.floor(Math.random() * 30) + 20; // 20-50%
cpuValue.textContent = `${newCpuValue}%`;
cpuBar.style.width = `${newCpuValue}%`;
}
if (memValue && memBar) {
const newMemValue = Math.floor(Math.random() * 20) + 45; // 45-65%
memValue.textContent = `${newMemValue}%`;
memBar.style.width = `${newMemValue}%`;
}
if (storageValue && storageBar) {
const newStorageValue = Math.floor(Math.random() * 5) + 60; // 60-65%
storageValue.textContent = `${newStorageValue}%`;
storageBar.style.width = `${newStorageValue}%`;
}
if (networkValue && networkBar) {
const newNetworkValue = Math.floor(Math.random() * 30) + 15; // 15-45%
networkValue.textContent = `${newNetworkValue}%`;
networkBar.style.width = `${newNetworkValue}%`;
}
}
// Update metrics every 5 seconds
setInterval(updateMetrics, 5000);
// Trigger an initial metrics update
updateMetrics();
});