document.addEventListener("DOMContentLoaded", () => { // Scroll page document.querySelectorAll(".nav-link").forEach((anchor) => { anchor.addEventListener("click", function (e) { e.preventDefault(); const target = document.querySelector(this.getAttribute("href")); if (!target) return; const targetPosition = target.getBoundingClientRect().top + window.scrollY; const startPosition = window.scrollY; const distance = targetPosition - startPosition; const duration = 1000; let startTime = null; function easeOutCubic(t) { // Custom easing function for gradual slowdown return 1 - Math.pow(1 - t, 3); } function scrollAnimation(currentTime) { if (!startTime) startTime = currentTime; const timeElapsed = currentTime - startTime; const progress = Math.min(timeElapsed / duration, 1); // Ensure progress doesn't exceed 1 const easeProgress = easeOutCubic(progress); window.scrollTo(0, startPosition + distance * easeProgress); if (progress < 1) { requestAnimationFrame(scrollAnimation); } } requestAnimationFrame(scrollAnimation); }); }); // dynamic scrolling document.addEventListener("scroll", () => { const navBar = document.querySelector(".navbar"); const titleBox = document.querySelector(".title-box"); const aboutSection = document.querySelector("#about"); const contactSection = document.querySelector("#contact"); const creditsSection = document.querySelector("#credits"); const parallaxlayer1 = document.querySelector(".layer-1"); const parallaxlayer2 = document.querySelector(".layer-2"); const parallaxlayer3 = document.querySelector(".layer-3"); const scrollY = window.scrollY; const aboutTop = aboutSection.getBoundingClientRect().top + scrollY; const contactTop = contactSection.getBoundingClientRect().top + scrollY; const sectionTop = creditsSection.offsetTop; const slowScrollRate = 0.5; if (scrollY < aboutTop) { const opacity1 = scrollY / aboutTop; titleBox.style.transform = `translateY(${scrollY * slowScrollRate}px)`; titleBox.style.opacity = Math.max(1 - opacity1, 0); } else { titleBox.style.transform = "translateY(0)"; titleBox.style.opacity = 0; } if (scrollY > contactTop) { const opacity2 = (scrollY - contactTop) / (document.body.scrollHeight - contactTop); navBar.style.opacity = Math.max(1 - opacity2, 0.5); } else { navBar.style.opacity = 1; } const relativeScrollY = sectionTop - scrollY; parallaxlayer1.style.transform = `translateY(${relativeScrollY * 0.2}px)`; parallaxlayer2.style.transform = `translateY(${relativeScrollY * 0.4}px)`; parallaxlayer3.style.transform = `translateY(${relativeScrollY * 0.6}px)`; }); // Function to load text from a file into an html component function loadTextFromFile(filePath, targetSelector) { fetch(filePath) .then((response) => { if (!response.ok) { throw new Error("Failed to fetch file: " + response.statusText); } return response.text(); }) .then((text) => { const targetElement = document.querySelector(targetSelector); if (targetElement) { targetElement.textContent = text; } else { console.error(`Target element not found: ${targetSelector}`); } }) .catch((error) => { console.error("Error loading text from file:", error); }); } // Load text files when page loads window.addEventListener("load", () => { loadTextFromFile("text/about.txt", ".about-paragraph"); loadTextFromFile("text/project1.txt", "#project1-paragraph"); loadTextFromFile("text/project2.txt", "#project2-paragraph"); loadTextFromFile("text/airship.txt", "#airship-text"); loadTextFromFile("text/jama.txt", "#jama-text"); loadTextFromFile("text/intel.txt", "#intel-text"); }); // Image carousel const images = document.querySelectorAll(".image-container"); const prevBtn = document.querySelector(".prev-btn"); const nextBtn = document.querySelector(".next-btn"); let currentIndex = 0; function updateImages() { images.forEach((img, index) => { img.classList.toggle("current-image", index === currentIndex); img.classList.toggle("hidden-image", index !== currentIndex); }); } prevBtn.addEventListener("click", () => { currentIndex = (currentIndex - 1 + images.length) % images.length; updateImages(); }); nextBtn.addEventListener("click", () => { currentIndex = (currentIndex + 1) % images.length; updateImages(); }); updateImages(); // On contact submit document .getElementById("contact-form") .addEventListener("submit", async function (event) { event.preventDefault(); const form = event.target; const formData = new FormData(form); try { const response = await fetch(form.action, { method: form.method, body: formData, headers: { Accept: "application/json", }, }); if (response.ok) { alert("Thank you! Your message has been sent."); form.reset(); } else { alert("Oops! There was a problem submitting your form."); } } catch (error) { console.error("Error:", error); alert( "There was a problem submitting your form. Please try again later." ); } }); });