dataduck/script.js
2026-03-02 19:07:46 +01:00

66 lines
1.6 KiB
JavaScript

document.documentElement.classList.add("js-ready");
const revealItems = document.querySelectorAll(".reveal");
const revealObserver = new IntersectionObserver(
(entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
entry.target.classList.add("is-visible");
revealObserver.unobserve(entry.target);
}
});
},
{
threshold: 0.18,
}
);
revealItems.forEach((item) => revealObserver.observe(item));
const counters = document.querySelectorAll(".counter");
const animateCounter = (element) => {
const target = Number(element.dataset.target);
const duration = 1400;
const startTime = performance.now();
const tick = (now) => {
const progress = Math.min((now - startTime) / duration, 1);
const eased = 1 - Math.pow(1 - progress, 3);
element.textContent = Math.round(target * eased);
if (progress < 1) {
requestAnimationFrame(tick);
}
};
requestAnimationFrame(tick);
};
const counterObserver = new IntersectionObserver(
(entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
animateCounter(entry.target);
counterObserver.unobserve(entry.target);
}
});
},
{
threshold: 0.4,
}
);
counters.forEach((counter) => counterObserver.observe(counter));
const contactForm = document.querySelector(".contact-form");
contactForm?.addEventListener("submit", (event) => {
event.preventDefault();
const button = contactForm.querySelector("button");
if (button) {
button.textContent = "Request Received";
button.disabled = true;
}
});